a.等差數列數組
numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])
返回在指定範圍內的均勻間隔的數字(組成的數組),也即返回一個等差數列
start - 起始點,
stop - 結束點
num - 元素個數,默認爲50,
endpoint - 是否包含stop數值,默認爲True,包含stop值;若爲False,則不包含stop值
retstep - 返回值形式,默認爲False,返回等差數列組,若爲True,則返回結果(array([`samples`, `step`])),
dtype - 返回結果的數據類型,默認無,若無,則參考輸入數據類型
import numpy as np
a = np.linspace(1,10,5,endpoint= True)
print(a) # [ 1. 3.25 5.5 7.75 10. ]
b = np.linspace(1,10,5,endpoint= False)
print(b) #[1. 2.8 4.6 6.4 8.2]
c = np.linspace(1,10,5,retstep = False)
print(c) # [ 1. 3.25 5.5 7.75 10. ]
d = np.linspace(1,10,5,retstep = True)
print(d) # (array([ 1. , 3.25, 5.5 , 7.75, 10. ]), 2.25)
numpy.arange(start,stop, step, dtype)
np.arange(3)
array([0, 1, 2])
np.arange(1,12,2)
array([ 1, 3, 5, 7, 9, 11])
步長爲整數一般用numpy.arrage();
步長不爲整數時,可以用linspace()
b.等比數列數組
numpy.logspace(start,stop, num, endpoint, base, dtype)
起始位和終止位代表的是10的冪(默認基數爲10),0代表10的0次方,9代表10的9次方
np.logspace(0,0,10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.logspace(0,9,10)
array([ 1.00000000e+00, 1.00000000e+01, 1.00000000e+02,
1.00000000e+03, 1.00000000e+04, 1.00000000e+05,
1.00000000e+06, 1.00000000e+07, 1.00000000e+08,
1.00000000e+09])
#改變基數,設置base指定底數
np.logspace(0,9,10,base=2)
array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
c.生成隨機抽樣數組
np.random
模塊
方法 | 說明 |
---|---|
np.random.rand(d0, d1, …, dn) | 返回[0.0,1.0)內的一組均勻分佈的數 |
np.random.randn(d0, d1, …, dn) | 返回一個樣本,具有標準正態分佈 |
np.random.randint(low[, high, size]) | 返回隨機的整數,位於半開區間 [low, high) |
np.random.uniform(low=0.0, high=1.0, size=None) | 從一個均勻分佈[low,high)中隨機採樣,注意定義域是左閉右開 |
np.random.normal(loc=0.0, scale=1.0, size=None) | loc:float,scale越大越矮胖,scale越小,越瘦高 |
np.random.standard_normal(size=None) | 返回指定形狀的標準正態分佈的數組 |
np.random.rand(2,3)
array([[0.90929803, 0.99886158, 0.33523116],
[0.07327932, 0.69353838, 0.21490553]])
np.random.randn(2,3)
array([[ 0.74864991, 1.05329894, 0.02006168],
[ 0.6431396 , -3.16055372, -0.735806 ]])
np.random.randint(2,10,(2,3))
array([[8, 5, 4],
[9, 3, 4]])
np.random.uniform(1,10,(2,3))
array([[4.05985597, 7.03859559, 4.11069599],
[9.00901488, 1.41927401, 5.75741741]])
np.random.normal(1,1,(2,3))
array([[-0.857967 , -0.31640625, 0.08087909],
[ 1.33571146, -0.90449108, 3.05647425]])
np.random.standard_normal(2)
array([0.54376329, 1.78806168])
d.數組的索引,切片
基本的索引和切片
示例1:
data3 = np.random.normal(0, 1, (3,4))
data3
array([[-0.5529426 , 0.73653997, -0.05788531, -0.13154318],
[-0.03079838, 1.33797554, -1.38323937, 2.05711507],
[ 0.57172354, 1.23990202, -1.04270338, 1.09079945]])
data3[0,0:3] #左閉右開
array([-0.5529426 , 0.73653997, -0.05788531])
示例2:
多維數組中,如果省略了後面的索引,則返回對象會是一個維度低一點的ndrray。
data4 = np.random.randint(2,20,(3,3,4))
print(data4)
print(data4[1,1,1])
print(data4[0])
[[[13 4 11 10]
[ 5 13 8 14]
[11 4 11 6]]
[[ 8 16 13 19]
[ 9 6 18 9]
[ 7 5 4 19]]
[[ 3 18 4 15]
[17 5 13 19]
[10 7 3 17]]]
6
[[13 4 11 10]
[ 5 13 8 14]
[11 4 11 6]]
如果想得到的是ndarray切片的副本,就需要顯示地進行復制:data[:].copy()
;
切片只能得到數組視圖。
data_old = data4[0].copy()
data4[0] = 66
print(data4)
data4[0] = data_old
print(data4)
[[[66 66 66 66]
[66 66 66 66]
[66 66 66 66]]
[[ 8 16 13 19]
[ 9 6 18 9]
[ 7 5 4 19]]
[[ 3 18 4 15]
[17 5 13 19]
[10 7 3 17]]]
===============================
[[[13 4 11 10]
[ 5 13 8 14]
[11 4 11 6]]
[[ 8 16 13 19]
[ 9 6 18 9]
[ 7 5 4 19]]
[[ 3 18 4 15]
[17 5 13 19]
[10 7 3 17]]]
布爾型索引
data1 = np.array(['a','b','a','c','b','d'])
data2 = data2 = np.arange(24).reshape(6,4)
print(data2)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
print(data1 == 'a')
[ True False True False False False]
print(data2[data1 == 'a']) #data1元素樹應該和data2維數相等
[[ 0 1 2 3]
[ 8 9 10 11]]
print(data2[data1 == 'a',2:])
[[ 2 3]
[10 11]]
ararry的數據爲float型時可以通過布爾值數組設置值
data2 = np.random.randn(6,4)
data2[data2 < 0] = 10
data2
array([[10. , 10. , 10. , 10. ],
[10. , 10. , 0.09817786, 0.14597538],
[ 1.16733605, 0.37248457, 0.36330872, 10. ],
[10. , 0.48706849, 0.03056452, 10. ],
[ 0.88857398, 10. , 10. , 10. ],
[ 1.1426662 , 10. , 10. , 10. ]])
花式索引(Fancy indexing)
花式索引就是利用整數數組進行索引
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.]])
一次傳入多個索引數組
data2 = np.arange(32).reshape((8,4))
print(arr)
print(arr[[1,5,7,2],[0,3,1,2]])#取值(1,0),(5,3),(7,1),(2,2)
[[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.]]
[1. 5. 7. 2.]
e.修改數組的形狀
ndarray.reshape(shape[, order])
ndarray.T
:數組的轉置
ndarray.resize(new_shape[, refcheck])
ndarray.transpose((ax1,ax2,ax3))
:由軸編號組成的元組進行軸進行轉置
ndarray.swapaxes(ax1,ax2)
: 將數組n個維度中兩個維度進行調換,不改變原數組
ndarray.flatten()
: 對數組進行降維,返回摺疊後的一維數組,原數組不變
示例1:
a = np.arange(20)
print(a.reshape([4,5]))
print(a)
print(a.resize([4,5])) #修改原數組,沒有返回值
print(a)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
None
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
示例2:
a.swapaxes(1,0)
array([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]])
示例3:
a.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
示例4:三維軸變換
data2 = np.arange(24).reshape((2,3,4))
data2
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]]])
data2.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
座標從(0,1,2)到(1,0,2),即0,1
軸互換,只需要把對應座標進行互換
[[[ 0,0,1 0,0,1, 0,02, 0,0,3],
[ 0,1,0, 0,1,1, 0,1,2, 0,1,3],
[ 0,2,0, 0,2,1, 0,2,1, 0,2,2]],
....]]]
互換後:
[[[ 0,0,1 0,0,1, 0,02, 0,0,3],
...],
[[0,1,0, 0,1,1, 0,1,2, 0,1,3],
...],
[[ 0,2,0, 0,2,1, 0,2,1, 0,2,2],
...]]
f.數組去重
ndarray.unique()
a = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
np.unique(a)
array([1, 2, 3, 4, 5, 6])