Numpy使用3

10978 ワード

前のブログではnumpyのいくつかの初期化方式とnumpyのデータ型(dtype)とshapeに関する知識を紹介し、numpy行列のインデックスとスライスを紹介した.
ベクトル化
numpy配列にはvectorizationをサポートする良い特性があり、同じサイズの配列で任意の操作を行うと要素レベルで演算されます.これはmatlabを使用するようにデータを操作できることを意味します.
In [46]: a = np.array([[1,2,4],[3,5,6]])

In [47]: b = np.array([[2,3,7],[4,5,7]])

In [48]: a+b
Out[48]: 
array([[ 3, 5, 11], [ 7, 10, 13]])

In [49]: a*b
Out[49]: 
array([[ 2, 6, 28], [12, 25, 42]])

In [50]: a * a
Out[50]: 
array([[ 1, 4, 16], [ 9, 25, 36]])

In [51]: 

ブロードキャスト
numpyのもう一つの良い特性はbroadcastingをサポートすることであり、配列とスカラーの演算も要素レベルにマッピングされます.
In [51]: 1 + a
Out[51]: 
array([[2, 3, 5], [4, 6, 7]])

In [52]: 2 * a  + 3 *b
Out[52]: 
array([[ 8, 13, 29], [18, 25, 33]])

In [53]: 

索引とスライス
(1)一次元配列
単純で普通の配列とほぼ同じです
In [55]: c
Out[55]: array([1, 4, 5, 2, 6, 7])

In [56]: c[3]  #     
Out[56]: 2

In [57]: c[2:4]  #        
Out[57]: array([5, 2])

In [58]: c[2:4] = 8  #       broadcasting

In [59]: c
Out[59]: array([1, 4, 8, 8, 6, 7])

In [60]: 

(2)多次元配列
多次元配列は多くのことができます.インデックスの下には次元の低い配列が表示されます.3 D配列を例に挙げて説明します.
<1>基本インデックス
In [60]: d = np.ones((3,4,4), dtype=np.int16)

In [61]: d
Out[61]: 
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], [1, 1, 1, 1], [1, 1, 1, 1]],

       [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]], dtype=int16)

In [62]: d += 4

In [63]: d  
Out[63]: 
array([[[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]],

       [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]],

       [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]], dtype=int16)

In [64]: d.shape
Out[64]: (3, 4, 4)  # d       (3*4*4)

###########         ,                2   
In [65]: d[0]
Out[65]: 
array([[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], dtype=int16)

In [66]: d[0].shape  # d[0]     ,   24*4
Out[66]: (4, 4)

In [67]: d[1][1]  # d[1][1]     ,   14
Out[67]: array([5, 5, 5, 5], dtype=int16)

In [68]: d[1,1]  #            
Out[68]: array([5, 5, 5, 5], dtype=int16)

In [69]: d[1,1] = 4 # broadcasting    

In [70]: d
Out[70]: 
array([[[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]],

       [[5, 5, 5, 5], [4, 4, 4, 4], [5, 5, 5, 5], [5, 5, 5, 5]],

       [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]], dtype=int16)

In [71]: d[1,1] = np.array([7,8,9,10])  #              

In [72]: d
Out[72]: 
array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)

In [73]: 


<2>スライスインデックス
In [73]: d
Out[73]: 
array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)

In [74]: d[:2]  #         0,          
Out[74]: 
array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)

In [75]: d[1:2, 1:2]
Out[75]: array([[[ 7, 8, 9, 10]]], dtype=int16)

In [76]: d[1:2, 1:2].shape
Out[76]: (1, 1, 4)

In [77]: d[1:2, 1:2] = 12  #        broadcasting  

In [78]: d
Out[78]: 
array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [12, 12, 12, 12], [ 5, 5, 5, 5], [ 5, 5, 5, 5]],

       [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)

<3>ブールインデックス
numpy配列はブールインデックスもサポート
In [80]: f = np.array([[1,3,5],[2,4,6]])

In [81]: f
Out[81]: 
array([[1, 3, 5], [2, 4, 6]])

In [82]: f == 4  #          ,  bool  
Out[82]: 
array([[False, False, False], [False, True, False]], dtype=bool)

In [83]: f[f==4]  #   f       4 
Out[83]: array([4])


##############         ,    &\|     

In [84]: mask = (f == 4) | (f == 6) 

In [85]: f[mask]
Out[85]: array([4, 6])



この記事はここまでですが、次のブログでは