Numpy使用3
前のブログではnumpyのいくつかの初期化方式とnumpyのデータ型(dtype)とshapeに関する知識を紹介し、numpy行列のインデックスとスライスを紹介した.
ベクトル化
numpy配列にはvectorizationをサポートする良い特性があり、同じサイズの配列で任意の操作を行うと要素レベルで演算されます.これはmatlabを使用するようにデータを操作できることを意味します.
ブロードキャスト
numpyのもう一つの良い特性はbroadcastingをサポートすることであり、配列とスカラーの演算も要素レベルにマッピングされます.
索引とスライス
(1)一次元配列
単純で普通の配列とほぼ同じです
(2)多次元配列
多次元配列は多くのことができます.インデックスの下には次元の低い配列が表示されます.3 D配列を例に挙げて説明します.
<1>基本インデックス
<2>スライスインデックス
<3>ブールインデックス
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] , 2, 4*4
Out[66]: (4, 4)
In [67]: d[1][1] # d[1][1] , 1, 4
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])
この記事はここまでですが、次のブログでは