numpy 基礎學習筆記(2)

  1. 一維數組的索引與切片
>>> import numpy as np
>>> a = np.arange(8)
>>> print a
[0 1 2 3 4 5 6 7]
>>> myslice = slice(3,7,2)
>>> print a[myslice]
[3 5]
>>> a = np.arange(9)
>>> print a[3:7]
[3 4 5 6]
>>> print[:7:2]
SyntaxError: invalid syntax
>>> print a[:7:2]
[0 2 4 6]
>>> print a[::-1]
[8 7 6 5 4 3 2 1 0]
>>> myslice = slice(3,7,2)
>>> print a[myslice]
[3 5]
>>> myslice1 = slice(None,None,-1)
>>> print a[myslice1]
[8 7 6 5 4 3 2 1 0]
  1. 多維數組的索引
    這裏寫圖片描述
>>> b = np.arange(24).reshape(2,3,4) #(塊,行,列)
>>> print b
[[[ 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 b.shape
(2, 3, 4)
>>> print b[0,0,0]
0
>>> print b[:,0,0]
[ 0 12]
>>> print b[0]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> print b[0,:,:]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> print b[0, ...]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> print b[0,1]
[4 5 6 7]
>>> print b[0,1,::2]
[4 6]
>>> print b[... ,1]
[[ 1  5  9]
 [13 17 21]]
>>> print b[:,1]
[[ 4  5  6  7]
 [16 17 18 19]]
>>> print b[0,:,-1]
[ 3  7 11]
>>> print b[0,::-1,-1]
[11  7  3]
>>> print b[0,::2,-1]
[ 3 11]
>>> print b[::-1]
[[[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]

 [[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]]
>>> s = slice(None,None,-1)
>>> print b[s,s,s]
[[[23 22 21 20]
  [19 18 17 16]
  [15 14 13 12]]

 [[11 10  9  8]
  [ 7  6  5  4]
  [ 3  2  1  0]]]
>>> 

3 布爾檢索

>>> arr = np.arange(36).reshape(6,6)
>>> 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, 32, 33, 34, 35]])
>>> x = np.array([0,1,2,1,4,5])
>>> x == 1 #通過比較得到一個布爾數組
array([False,  True, False,  True, False, False], dtype=bool)
>>> arr[x == 1] #布爾索引
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])

從結果上看,布爾索引取出了布爾值爲True的行。
布爾型數組的長度和索引的數組的行數(軸長度)必須一致。
布爾型數組可與切片,整數(整數序列)一起使用。

4 花式檢索
花式索引(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.]])
>>> 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.]])
'''      
我們可以看到花式索引的結果,以一個特定的順序排列。
而這個順序,就是我們所傳入的整數列表或者ndarray。
這也爲我們以特定的順序來選取數組子集,提供了思路。
'''

>>> arr = np.arange(32).reshape((8,4))
>>> print arr
[[ 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]]
>>> arr[[1,5,7,2],[0,3,1,2]]

'''
這個返回的是,第一行第0個元素,第5行第3個元素,依次類推
'''

array([ 4, 23, 29, 10])

經過對比可以發現,返回的一維數組中的元素,分別對應(1,2)、(3,0)….
這一樣一下子就清晰了,我們傳入來兩個索引數組,相當於傳入了一組平面座標,從而進行了定位。
此處,照我這樣理解的話,那麼一個N維數組,我傳入N個索引數組的話,是不是相當於我傳入了一個N維座標。

>>> 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]])
>>> 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]])
>>> ar = np.arange(27).reshape(3,3,3)
>>> ar
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]]])
>>> ar[[1,2],[0,1],[2,2]]
array([11, 23])

那麼應該如何得到一個矩形區域呢。可以這樣做:

>>> 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]])
10 13 11 12
5 0 53 51 52
70 73 71 72
20 23 21 22

上表中的70指的是第7行第0列那個元素

必須明白,arr7[2][3]等價於arr7[2,3]
那麼上面這種得到矩形區域的方法,就相當於行與列去了交集。
此外還可用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]])
>>> 

5 數組的轉置

>>> arr = np.arange(15).reshape(3,5)
>>> arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> arr.T
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

6 改變數組的維度

>>> b = np.arange(24).reshape(2,3,4)
>>> print b
[[[ 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 b.ravel()
[ 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 b.flatten()
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
>>> b.shape
(2, 3, 4)
>>> b.reshape(6,4)
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]])
>>> print b.transpose()
[[[ 0 12]
  [ 4 16]
  [ 8 20]]

 [[ 1 13]
  [ 5 17]
  [ 9 21]]

 [[ 2 14]
  [ 6 18]
  [10 22]]

 [[ 3 15]
  [ 7 19]
  [11 23]]]
>>> b.resize((2,12))
>>>> print b.resize((2,12))
None
>>> print b
[[ 0  1  2  3  4  5  6  7  8  9 10 11]
 [12 13 14 15 16 17 18 19 20 21 22 23]]

7 結合數組

>>> a = np.arange(9).reshape(3,3)
>>> print a
[[0 1 2]
 [3 4 5]
 [6 7 8]]
>>> b = 2*a
>>> print b
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
>>> print np.hstack((a,b))
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
>>> print np.concatenate((a,b),axis = 1)
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
>>> print np.vstack((a,b))
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
>>> print np.concatenate((a,b),axis = 0)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
>>> print np.dstack((a,b))
[[[ 0  0]
  [ 1  2]
  [ 2  4]]

 [[ 3  6]
  [ 4  8]
  [ 5 10]]

 [[ 6 12]
  [ 7 14]
  [ 8 16]]]
>>> oned = np.arange(2)
>>> print oned
[0 1]
>>> twice_oned = 2*oned
>>> print twice_oned
[0 2]
>>> print np.column_stack((oned,twice_oned))
[[0 0]
 [1 2]]
>>> print np.column_stack((a,b))
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
>>> print np.column_stack((a,b))
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
>>> print np.column_stack((a,b)) == np.hstack((a,b))
[[ True  True  True  True  True  True]
 [ True  True  True  True  True  True]
 [ True  True  True  True  True  True]]
>>> print np.row_stack((oned,twice_oned))
[[0 1]
 [0 2]]
>>> print np.row_stack((a,b))
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
>>> print np.row_stack((a,b)) == np.vstack((a,b))
[[ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]]
>>> 

8 數組的分割

>>> a = np.arange(9).reshape(3,3)
>>> print a
[[0 1 2]
 [3 4 5]
 [6 7 8]]
>>> print np.hsplit(a,3)
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
>>> print np.split(a,3,axis = 1)
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
>>> print np.vsplit(a,3)
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
>>> print np.split(a,3,axis=1)
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
>>> print np.split(a,3,axis = 0)
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
>>> c = np.arange(27).reshape(3,3,3)
>>> print c
[[[ 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]]]
>>> print np.dsplit(c,3)
[array([[[ 0],
        [ 3],
        [ 6]],

       [[ 9],
        [12],
        [15]],

       [[18],
        [21],
        [24]]]), array([[[ 1],
        [ 4],
        [ 7]],

       [[10],
        [13],
        [16]],

       [[19],
        [22],
        [25]]]), array([[[ 2],
        [ 5],
        [ 8]],

       [[11],
        [14],
        [17]],

       [[20],
        [23],
        [26]]])]
>>> print np.dsplit(c,3)
[array([[[ 0],
        [ 3],
        [ 6]],

       [[ 9],
        [12],
        [15]],

       [[18],
        [21],
        [24]]]), array([[[ 1],
        [ 4],
        [ 7]],

       [[10],
        [13],
        [16]],

       [[19],
        [22],
        [25]]]), array([[[ 2],
        [ 5],
        [ 8]],

       [[11],
        [14],
        [17]],

       [[20],
        [23],
        [26]]])]
>>> print np.split(a,3,axis=1)
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
>>> print np.split(c,3,axis = 1)
[array([[[ 0,  1,  2]],

       [[ 9, 10, 11]],

       [[18, 19, 20]]]), array([[[ 3,  4,  5]],

       [[12, 13, 14]],

       [[21, 22, 23]]]), array([[[ 6,  7,  8]],

       [[15, 16, 17]],

       [[24, 25, 26]]])]
>>> print np.split(c,3,axis = 0)
[array([[[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]]]), array([[[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]]), array([[[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])]
>>> 

9數組的屬性

>>> b = np.arange(24).reshape(2,12)
>>> b.ndim
2
>>> b.size
24
>>> b.itemsize
4
>>> b.nbytes
96
>>> b = np.array([1.0+1.0j,3.0+2.0j])
>>> b.real
array([ 1.,  3.])
>>> b.imag
array([ 1.,  2.])
>>> b = np.arange(4).reshape(2,3)

Traceback (most recent call last):
  File "<pyshell#142>", line 1, in <module>
    b = np.arange(4).reshape(2,3)
ValueError: cannot reshape array of size 4 into shape (2,3)
>>> b = np.arange(4).reshape(2,2)
>>> b.flat
<numpy.flatiter object at 0x03D08F38>
>>> b.flat[2]
2
>>> 

10數組的轉換

>>> b  = np.array([1.0+1.0j,3.0+2.0j])
>>> print b
[ 1.+1.j  3.+2.j]
>>> print b.tolist()
[(1+1j), (3+2j)]
>>> print b.tostring()

>>> print np.fromstring('\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00@', dtype=complex)
[ 1.+1.j  3.+2.j]
>>> print np.fromstring('20:42:52',sep=':', dtype=int)
[20 42 52]
>>> print b
[ 1.+1.j  3.+2.j]
>>> print b.astype(int)

Warning (from warnings module):
  File "__main__", line 2
ComplexWarning: Casting complex values to real discards the imaginary part
[1 3]
>>> print b.astype('complex')
[ 1.+1.j  3.+2.j]
>>> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章