はじめに
numpyの多次元配列の次元を落としたり,任意の2つの一元配列を取り出して分散図を書く練習をします.
ここではサイズ2×3×4の3次元の配列を題材とします.
インデックスはdata[z][y][x]のように,zからx方向に並びます.zは最大1,yは最大2,xは最大3となります.本記事における配列の図はすべて,奥行きをz,下方向yを,右方向をxとしています.
練習
練習1 題材となる3次元配列の生成
問題
以下の図のようにdata[z][y][x]=(z+1)*100+(y*10)+(z+1)という値が設定されている3次元配列を生成してください.
解答例
3重ループ文で書く場合
q0.py
>>>data=np.zeros((2,3,4),dtype=np.int)>>>forxinrange(4):...foryinrange(3):...forzinrange(2):...data[z][y][x]=(z+1)*100+(y+1)*10+x+1
内包表記でも書けます
q1.py
>>>importnumpyasnp>>>data=np.array([[[(z+1)*100+(y+1)*10+x+1forxinrange(4)]foryinrange(3)]forzinrange(2)])>>>dataarray([[[111,112,113,114],[121,122,123,124],[131,132,133,134]],[[211,212,213,214],[221,222,223,224],[231,232,233,234]]])>>>data[1,2,3]234
練習2 1次元配列(ベクトル)の取り出し
問題2-1 赤色部分のデータを1元配列として取り出してください
解答例2-1
q2-1.py
>>>data[1,2,:]array([231,232,233,234])#省略形
>>>data[1,2]array([231,232,233,234])
問題2-2 赤色部分のデータを1元配列として取り出してください
解答例2-2
q2-2.py
>>>data[1,:,2]array([213,223,233])
問題2-3 赤色部分のデータを1元配列として取り出してください
解答例2-3
q2-3.py
>>>data[:,1,2]array([123,223])
練習3 2次元配列の取り出し
問題3-1 赤色部分のデータを2元配列として取り出してください
解答例3-1
q3-1.py
>>>data[1,:,:]array([[211,212,213,214],[221,222,223,224],[231,232,233,234]])#省略形
>>>data[1]array([[211,212,213,214],[221,222,223,224],[231,232,233,234]])
問題3-2 赤色部分のデータを2元配列として取り出してください
解答例3-2
q3-2.py
>>>data[:,1,:]array([[121,122,123,124],[221,222,223,224]])#省略形
>>>data[:,1]array([[121,122,123,124],[221,222,223,224]])
問題3-3 赤色部分のデータを2元配列として取り出してください
解答例3-3
q3-3.py
>>>data[:,:,1]array([[112,122,132],[212,222,232]])
練習4 スライス
問題4-1 図のZ方向に取り出した1次元配列の最初の要素をスライスします
解答例4-1
q4-1.py
>>>data[1:,1,2]array([223])
上の通り結果はスカラではなく配列です.
問題4-2 図ように取り出した2次元配列のyの最初の要素をスライスします
解答例4-2
q4-2.py
>>>data[:,1:,1]array([[122,132],[222,232]])
問題4-3 図ようにもとの配列をスライスします
解答例4-3
q4-3.py
>>>data[:,:,1:3]array([[[112,113],[122,123],[132,133]],[[212,213],[222,223],[232,233]]])
練習5 分散図
問題5-1 図の赤い部分を2つの1次元配列とみなして,その関係を分散図として表示してください.
解答例5-1
q5-1.py
>>>importmatplotlib.pyplotasplt>>>(data[0,1,:],data[1,1,:])(array([121,122,123,124]),array([221,222,223,224]))>>>plt.scatter(data[0,1,:],data[1,1,:])<matplotlib.collections.PathCollectionobjectat0x0000019ACC48C208>>>>plt.show()
問題5-2 図の赤い部分を2つの1次元配列とみなして,その関係を分散図として表示してください
解答例5-2
q5-2.py
>>>(data[0,:,1],data[1,:,1])(array([112,122,132]),array([212,222,232]))>>>plt.scatter(data[0,:,1],data[1,:,1])<matplotlib.collections.PathCollectionobjectat0x0000019AC6F14A08>>>>plt.show()
問題5-3 図の赤い部分を2つの1次元配列とみなして,その関係を分散図として表示してください
解答例5-3
q5-3.py
>>>(data[:,1,2],data[:,2,2])(array([123,223]),array([133,233]))>>>plt.scatter(data[:,1,2],data[:,2,2])<matplotlib.collections.PathCollectionobjectat0x0000019AC70D1808>>>>plt.show()