NumPy(三):基本操作

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])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章