#1行5列
data = np.array([1,2,3,4,5])
data.shape
(5,)
#3行4列
data = np.array([[1,2,3,0],[4,5,6,0],[7,8,9,0]])
data.shape
(3, 4)
# 2行3列2維
data = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
data.shape
(2, 2, 3)
data.dtype
dtype('int64')
1.創建ndarray
ndarray
是NumPy中多維數組對象,是一個快速而靈活的大數據容器,其中所有元素必須具有相同類型
Numpy中如果沒有特殊指定,數據類型基本都是float64
(浮點型)
import numpy as np
data = [6,7.5,8,0,1]
arr1 = np.array(data) #創建一維矩陣
arr1
array([6. , 7.5, 8. , 0. , 1. ])
arr1.shape #返回一個表示各維度大小的元組,第一個數標識
(5,)
arr1.dtype #返回一個說明數組數據類型的對象,numpy關注的是數值運算,默認float64 浮點數,數據類型
dtype('float64')
data = [[1,2,3,4],[5,6,7,8]] #創建二維矩陣
arr2 = np.array(data)
arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
zeros()
創建全0矩陣
np.zeros(10) #創建 1x10x1 全0矩陣
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,6)) #創建3x6x1 全0矩陣 3行6列,1維矩陣
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
np.zeros((2,3,3)) #創舉3x3x2 全0矩陣 3行3列,2維矩陣
array([[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]]])
ones()
創建全1矩陣
np.ones(10) #創建 1x10x1 全1矩陣
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,6)) #創建3x6x1 全1矩陣 3行6列,1維矩陣
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
np.ones((2,3,4))
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
empty()
可以創建一個沒有任何具體值的數組
np.empty((2,3,2)) # 2列,3行,2維
#返回的是未經初始化的垃圾值
array([[[6.94646086e-310, 4.64671213e-310],
[6.94645989e-310, 6.94645967e-310],
[6.94645994e-310, 3.21142670e-322]],
[[6.94646086e-310, 4.64671213e-310],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000]]])
arange()
是python內置函數range的數組版本,返回的是一個ndarray而不是列表
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
2.ndarray的數據類型
類型 | 類型代碼 | 說明 |
---|---|---|
int8,uint8 | i1,u1 | 有符號和無符號的8位(1字節)整型 |
int16,uint16 | i2,u2 | 有符號和無符號的16位(2字節)整型 |
int32,uint32 | i4,u4 | 有符號和無符號的32位(4字節)整型 |
int64,uint64 | i8,u8 | 有符號和無符號的64位(8字節)整型 |
float16 | f2 | 半精度浮點數 |
float32 | f4或f | 標準的單精度浮點數.與C的float兼容 |
float64 | f8或d | 標準雙精度浮點數.與C的double和python的float對象兼容 |
float128 | f16或g | 擴展精度浮點數 |
complex64,complex128,complex256 | c8,c16,c32 | 分別用兩個32位,64位或128位浮點數表示的複數 |
bool | ? | 存儲True和False值的布爾類型 |
object | O | Python對象類型 |
string_ | S | 固定長度的字符串類型(每個字符1個字節). 例如:要創建一個長度爲10的字符串,應使用S10 |
unicode_ | U | 固定長度的unicode類型(字節數由平臺決定). 跟字符串的定義方式一樣(如U10) |
2.1 astype()數據類型轉化
調用astype無論如何都會創建出一個新的數組(原始數組的一份拷貝),即使新dtype跟老dtype相同也是如此
注意 浮點數(比如float64和float32)只能表示近似的分數值.在複雜計算中,由於可能會積累一些浮點錯誤,因此比較操作只能在一定小數位內有效
整數轉爲浮點數
arr = np.array([1,2,3,4,5])
arr.dtype
dtype('int64')
float_arr = arr.astype(np.float64)
float_arr.dtype
dtype('float64')
浮點數轉爲整數
轉換過程中小數部分會直接被截斷
arr = np.array([3.7,-1.2,-2.6,0.5,12.9,10.1])
arr.dtype
dtype('float64')
arr.astype(np.int32)
array([ 3, -1, -2, 0, 12, 10], dtype=int32)
全是數字的字符串數組 轉爲 數值
numeric_strings = np.array(['1.25','-9.6','42'],dtype=np.string_)
numeric_strings.astype(float)
array([ 1.25, -9.6 , 42. ])
numeric_strings.astype(np.float64)
array([ 1.25, -9.6 , 42. ])
支持參數是返回的數據類型
int_array = np.arange(10)
calibers = np.array([.27,.270,.357,.380,.44,.50],dtype=np.float64)
int_array.astype(calibers.dtype)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
使用類型代碼定義數據類型
empty_uint32 = np.empty(8,dtype='u4')
empty_uint32
array([ 0, 1075314688, 0, 1075707904, 0,
1075838976, 0, 1072693248], dtype=uint32)
3.索引和切片
3.1 一維數組
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[:]
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr[5] #第6個元素
5
arr[5:8] #第6個元素到第8個元素
array([5, 6, 7])
數組中 值的更改
跟列表最重要的區別在於,數組切片是原始數組的視圖.這意味着數據不會被複制,視圖上的任何修改都會直接反應到源數據上
arr[5:8] = 12
arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr_slice = arr[5:8]
arr_slice
array([12, 12, 12])
arr_slice[1] = 145
arr
array([ 0, 1, 2, 3, 4, 64, 145, 64, 8, 9])
arr_slice[:] = 64
arr
array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
其他用法
old_data = data.copy()
data[data < 0] = 0
data
array([[0. , 1.69865101, 0. , 0.49518769],
[0.37951591, 0. , 0. , 0. ],
[0.44686031, 2.0746266 , 1.68538262, 0. ],
[0.37011546, 0. , 0.7600543 , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0.79192211, 0. , 0. ],
[2.92470818, 0. , 0.26734807, 0.94358864]])
data[names != 'Joe'] = 7
data
array([[7. , 7. , 7. , 7. ],
[0.37951591, 0. , 0. , 0. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0. , 0.79192211, 0. , 0. ],
[2.92470818, 0. , 0.26734807, 0.94358864]])
3.2 二維數組
各索引位置上的元素不再是標量而是一維數組
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[2] #獲取 第3行元素
array([7, 8, 9])
print(arr2d[0][2]) #獲取 1行3列的值
print(arr2d[0,2])
3
3
arr2d[:1] #返回第 1行
array([[1, 2, 3]])
arr2d[:2] #返回前 2行
array([[1, 2, 3],
[4, 5, 6]])
arr2d[:3] #返回前 3行,即所有
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[:2,1:] # 返回前2行, 從第 2列到最後一列 所有元素
array([[2, 3],
[5, 6]])
arr2d[:2,2:] # 返回前2行,從第 3列到最後一列(即最後一列)所有元素
array([[3],
[6]])
arr2d[:2,:1] # 返回前 2行,第 1列的值
array([[1],
[4]])
arr2d[:2,:2] # 返回前 2行,第 1列 到 第 2列的值
array([[1, 2],
[4, 5]])
arr2d[:2,1:2] # 返回前 2行,第 2列的值
array([[2],
[5]])
3.3 多維數組
第一個數表示 維度, 第二個數表示行, 第三個數表示列
arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d # 2行3列2維度
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0] # 返回第一維度的數組
array([[1, 2, 3],
[4, 5, 6]])
arr3d[1,0] # 返回第二維度第一行數據
array([7, 8, 9])
3.4 複製–數組切片
.copy() 得到的是ndarray切片的一份副本而非視圖
old_values = arr3d[0].copy()
arr3d[0] = 42
arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0] = old_values
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
3.5 布爾型索引
布爾型數組的長度必須跟被索引的數組的行數一致
Python關鍵字 and 和 or 在布爾型數組中無效
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4) #使用numpy.random中的randn函數生成一些正態分佈的隨機數
names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
data
array([[-0.69367557, 1.69865101, -0.23921684, 0.49518769],
[ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
[ 0.44686031, 2.0746266 , 1.68538262, -0.10811949],
[ 0.37011546, -0.65505409, 0.7600543 , -1.97341031],
[-0.31347836, -1.11806019, -1.11968691, -0.73714439],
[-0.94361467, 0.79192211, -0.23550452, -0.02805382],
[ 2.92470818, -0.32589702, 0.26734807, 0.94358864]])
names == 'Bob'
array([ True, False, False, True, False, False, False])
data[names == 'Bob'] # 返回第1行 和 第4行
array([[-0.69367557, 1.69865101, -0.23921684, 0.49518769],
[ 0.37011546, -0.65505409, 0.7600543 , -1.97341031]])
data[names == 'Bob',2:] # 返回第1行和第4行, 第3列到最後一列的值
array([[-0.23921684, 0.49518769],
[ 0.7600543 , -1.97341031]])
data[names == 'Bob',3] #將第4列,第1行和4行的值組成數組
array([ 0.49518769, -1.97341031])
使用 != 非 ~
names != 'Bob'
array([False, True, True, False, True, True, True])
data[~(names == 'Bob')] #返回非1和4行
array([[ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
[ 0.44686031, 2.0746266 , 1.68538262, -0.10811949],
[-0.31347836, -1.11806019, -1.11968691, -0.73714439],
[-0.94361467, 0.79192211, -0.23550452, -0.02805382],
[ 2.92470818, -0.32589702, 0.26734807, 0.94358864]])
使用 &(和), |(或)
mask = (names == 'Bob') | (names == 'Will')
mask
array([ True, False, True, True, True, False, False])
data[mask]
array([[-0.69367557, 1.69865101, -0.23921684, 0.49518769],
[ 0.44686031, 2.0746266 , 1.68538262, -0.10811949],
[ 0.37011546, -0.65505409, 0.7600543 , -1.97341031],
[-0.31347836, -1.11806019, -1.11968691, -0.73714439]])
3.6 花式索引
指利用整數數組進行索引
花式索引跟切片不一樣,它總是將數據複製到新數組中
arr = np.empty((8,4))
for i in range(8):
arr[i] = i
arr
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
以特定順序選取行子集
傳入一個用於指定的整數 列表 或ndarray即可
arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]])
#使用負數索引將從末尾開始選取行
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
arr = np.arange(32).reshape((8,4))
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
#矩陣(0,0)開始
#返回(1,0),(5,3),(7,1),(2,2)
arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
np.ix_函數,它可以將兩個一維數組轉換爲一個用於選取方形區域的索引器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
4. 數組轉置和軸對稱
arr = np.arange(15).reshape((3,5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
Transpose 轉置
轉置是一種特殊形式,返回的是源數據的視圖(不會進行任何複製操作)
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.T
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
np.dot() 計算矩陣內積
arr
np.dot(arr.T,arr)
array([[125, 140, 155, 170, 185],
[140, 158, 176, 194, 212],
[155, 176, 197, 218, 239],
[170, 194, 218, 242, 266],
[185, 212, 239, 266, 293]])
swapaxes()
arr = np.arange(16).reshape((2,2,4))
arr.swapaxes(1,2)
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
5.通用函數(ufunc)
一元ufunc
函數 | 說明 |
---|---|
abs,fabs | 計算整數,浮點數或複數的絕對值 對於非複數值,可以使用更快的fabs |
sqrt | 計算各元素的平方根 |
square | 計算各元素的平方 |
exp | 計算各元素的指數 |
log,log10,log2,log1p | 分別爲自然對數(底數爲e),底數爲10的log,底數爲2的log,log(1+x) |
sign | 計算各元素的正負號:1(正數),0(零),-1(負數) |
ceil | 計算各元素的ceiling值,即大於等於該值的最小整數 |
floor | 計算個元素的floor值,即小於等於該值的最大整數 |
rint | 將各元素值四捨五入到最接近的整數,保留dtype |
modf | 將數組的小數和整數部分以兩個獨立數組的形式返回 |
isnan | 返回一個表示"哪些值是NaN(這不是一個數字)"的布爾型數組 |
isfinite,isinf | 分別返回一個表示"哪些元素是又窮的(非inf,非NaN)"或"哪些元素是無窮的"的布爾型數組 |
cos,cosh,sin,sinh,tan,tanh | 普通型和雙曲型三角函數 |
arccos,arccosh,arcsin,arcsinh,arctan,arctanh | 反三角函數 |
logical_not | 計算各元素not x的真值 |
import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr)
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
2.98095799e+03, 8.10308393e+03])
二元ufunc
函數 | 說明 |
---|---|
add | 將數組中對應的元素相加 |
subtract | 從第一個數組中減去第二個數組中的元素 |
multiply | 數組元素相乘 |
divide,floor_divide | 除法或向下圓整除法(丟棄餘數) |
power | 對第一個數組的元素A,根據第二個數組中的相應元素B,計算 |
maximum,fmax | 元素級的最大值計算.fmax將忽略NaN |
minimum,fmin | 元素級的最小值計算.fmin將忽略NaN |
mod | 元素級的求模計算(除法的餘數) |
copysign | |
greater,greater_equal,less,less_equal,equal,not_equal | 執行元素級的比較運算,最終產生布爾型數組.相當於中綴運算>,>=,<,<=,==,!= |
logical_and,logical_or,logical_xor | 執行元素級的真值邏輯運算. 相當於&,|,^ |
x = np.random.randn(8)
x
array([ 0.7782637 , 2.01053018, 1.35868291, 0.21749182, 0.01305496,
0.38470116, -1.57178628, 2.19639081])
y = np.random.randn(8)
y
array([ 1.28050252, -1.77657855, 0.23944536, 0.21039616, -0.75090526,
1.06167301, 0.18368341, -0.63631676])
np.maximum(x,y)
array([1.28050252, 2.01053018, 1.35868291, 0.21749182, 0.01305496,
1.06167301, 0.18368341, 2.19639081])
np.modf(x)
(array([ 0.7782637 , 0.01053018, 0.35868291, 0.21749182, 0.01305496,
0.38470116, -0.57178628, 0.19639081]),
array([ 0., 2., 1., 0., 0., 0., -1., 2.]))