Numpy★配列の便利な関数

NumPyには配列を扱う為の関数がたくさんあります。配列操作に関する関数の代表的なものを確認してみましょう。
配列の型変換
astype
現在の配列の型を指定された型に変換します。
astype( 変換する型名 )
import numpy as np
x = np.array([1.3, 2, 2.5])
x.astype(int)
【実行結果】
array([1, 2, 2])
配列のコピー
copy
配列のコピーを作ります。
copy( 配列 )
import numpy as np
x = np.random.randint(0,10,(3,3))
a = np.copy(x)
a
【実行結果】
array([[0, 4, 6],
[3, 6, 0],
[4, 9, 0]])
repeat
数字又は配列を指定回数コピーします。
import numpy as np
x = np.random.rand(2,3)
print(x)
# xを3回repeat
a = np.repeat(x,3)
print(a)
# xをaxis=0で3回repeat
b = np.repeat(x,3,axis=0)
print(b)
【実行結果】
[[0.29022822 0.53284398 0.92211234]
[0.05523121 0.03447852 0.86573614]]
[0.29022822 0.29022822 0.29022822 0.53284398 0.53284398 0.53284398
0.92211234 0.92211234 0.92211234 0.05523121 0.05523121 0.05523121
0.03447852 0.03447852 0.03447852 0.86573614 0.86573614 0.86573614]
[[0.29022822 0.53284398 0.92211234]
[0.29022822 0.53284398 0.92211234]
[0.29022822 0.53284398 0.92211234]
[0.05523121 0.03447852 0.86573614]
[0.05523121 0.03447852 0.86573614]
[0.05523121 0.03447852 0.86573614]]
配列の再構成
reshape
配列の行と列の構成を作り直します。
reshape( a, newshape, order )
元の配列.reshape( newshape )
a | 元の配列 |
newshape | 再構成する配列または数字 ※-1が指定された時は適宜調整 |
order | (オプション) C:(初期値)C言語のインデックス F:Fortranのインデックス A:元の配列がFortranのインデックスなら同様、それ以外はC言語 |
import numpy as np
x = np.arange(1,10)
np.reshape( x, (3,3) )
【実行結果】
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
または
import numpy as np
np.arange(1,10).reshape(3,3)
【実行結果】
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
newaxis
配列に軸を追加します。
配列[ np.newaxis , : ]
配列[ : , np.newaxis ]
追加したい軸にnewaxisを記載
import numpy as np
x = np.arange(3)
print(x)
x1 = x[:,np.newaxis]
print(x1)
x2 = x[np.newaxis,:]
print(x2)
【実行結果】
[0 1 2]
[[0]
[1]
[2]]
[[0 1 2]]
配列の転置
※転置・・・m行n列の行列にたいしてn行m列に変換すること、または要素(i,j)を(j,i)に変換すること
transpose
指定された配列の転置を行います、また軸の順番を指定した通りに入れ替えます。
import numpy as np
x = np.random.rand(3,2)
print(x)
np.transpose(x)
【実行結果】
[[0.50502585 0.50641738]
[0.85576715 0.860163 ]
[0.10661862 0.19581169]]
array([[0.50502585, 0.85576715, 0.10661862],
[0.50641738, 0.860163 , 0.19581169]])
【例】axes(軸)を指定した場合
import numpy as np
x = np.random.rand(3, 2, 4)
print(x.shape)
print(x)
y = np.transpose(x, (1, 0, 2))
print(y.shape)
print(y)
【実行結果】
(3, 2, 4)
[[[0.61930157 0.14794724 0.55267526 0.29351113]
[0.67954851 0.89693323 0.85923571 0.64340073]]
[[0.90053943 0.04808644 0.20824039 0.52873314]
[0.84438351 0.46927075 0.15974774 0.58888543]]
[[0.70662249 0.56888343 0.7720982 0.38901882]
[0.0595412 0.11000537 0.27945041 0.29740861]]]
(2, 3, 4)
[[[0.61930157 0.14794724 0.55267526 0.29351113]
[0.90053943 0.04808644 0.20824039 0.52873314]
[0.70662249 0.56888343 0.7720982 0.38901882]]
[[0.67954851 0.89693323 0.85923571 0.64340073]
[0.84438351 0.46927075 0.15974774 0.58888543]
[0.0595412 0.11000537 0.27945041 0.29740861]]]
.T
配列の転置を行います。
配列.T
import numpy as np
x = np.random.rand(3,2)
print(x)
print(x.T)
【実行結果】
[[0.10861353 0.58412851]
[0.65904772 0.86498826]
[0.55548895 0.37843164]]
[[0.10861353 0.65904772 0.55548895]
[0.58412851 0.86498826 0.37843164]]
配列の連結
concatenate
軸に沿って配列を連結します。
concatenate( [ 連結対象の配列1, 連結対象の配列2, … ], 連結する軸 )
※連結対象の配列のディメンション(次元)が同じであること
連結する軸が"0″の場合
import numpy as np
x = np.array([[1,2,3],[11,12,13]])
y = np.array([[5,6,7],[21,22,23]])
np.concatenate([x,y],0)
【実行結果】
array([[ 1, 2, 3],
[11, 12, 13],
[ 5, 6, 7],
[21, 22, 23]])
連結する軸が"1″の場合
import numpy as np
x = np.array([[1,2,3],[11,12,13]])
y = np.array([[5,6,7],[21,22,23]])
np.concatenate([x,y],1)
【実行結果】
array([[ 1, 2, 3, 5, 6, 7],
[11, 12, 13, 21, 22, 23]])
vstack
配列を縦方向に連結します。
vstack( [ 連結対象の配列1, 連結対象の配列2, … ] )
※連結対象の配列の要素が同じであること
import numpy as np
x1 = np.array([1,2,3])
x2 = np.array([2,3,5])
x3 = np.array([3,5,6])
np.vstack([x1,x2,x3])
【実行結果】
array([[1, 2, 3],
[2, 3, 5],
[3, 5, 6]])
hstack
配列を横方向に連結します。
hstack( [ 連結対象の配列1, 連結対象の配列2, … ] )
numpy.hstack 公式
import numpy as np
y1 = np.array([1,2,3])
y2 = np.array([2,3,5])
y3 = np.array([3,5,6])
np.hstack([y1,y2,y3])
【実行結果】
array([1, 2, 3, 2, 3, 5, 3, 5, 6])
hstackは行数が同じなら列数が異なっていても連結できます。つまりブロードキャストルールが適用されます。
import numpy as np
y1 = np.array([[10, 0],
[0, 30],
[0, 0]])
y2 = np.array([[60],
[0],
[0]])
y3 = np.array([[10, 0],
[0, 30],])
【例】ブロードキャストルールが適用される場合
np.hstack([y1,y2])
array([[10, 0, 60],
[ 0, 30, 0],
[ 0, 0, 0]])
【例】ブロードキャストルールが適用されない場合
np.hstack([y1,y3])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-48-f47f15844d6c> in <module>
----> 1 np.hstack([y1,y3])
<__array_function__ internals> in hstack(*args, **kwargs)
C:\ProgramData\Anaconda3\envs\v_tensor_1\lib\site-packages\numpy\core\shape_base.py in hstack(tup)
344 return _nx.concatenate(arrs, 0)
345 else:
--> 346 return _nx.concatenate(arrs, 1)
347
348
<__array_function__ internals> in concatenate(*args, **kwargs)
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 0, the array at index 0 has size 3 and the array at index 1 has size 2
配列の分割
split
指定した場所で配列を分割します。
split( 分割対象の配列, [分割する場所1,分割する場所2,…] )
import numpy as np
x = np.arange(9)
x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
【実行結果】
[0 1 2] [3 4] [5 6 7 8]
vsplit
配列を縦方向に分割します。
vsplit( 分割対象の配列, [分割する場所1,分割する場所2,…] )
import numpy as np
grid = np.arange(24).reshape((4,6))
print('grid')
print(grid)
upper,lower = np.vsplit(grid,[3])
print('upper')
print(upper)
print('lower')
print(lower)
【実行結果】
grid
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
upper
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
lower
[[18 19 20 21 22 23]]
hsplit
配列を横方向に分割します。
hsplit( 分割対象の配列, [分割する場所1,分割する場所2,…] )
import numpy as np
grid = np.arange(24).reshape((4,6))
print('grid')
print(grid)
left,right = np.hsplit(grid,[4])
print('left')
print(left)
print('right')
print(right)
【実行結果】
grid
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
left
[[ 0 1 2 3]
[ 6 7 8 9]
[12 13 14 15]
[18 19 20 21]]
right
[[ 4 5]
[10 11]
[16 17]
[22 23]]
配列の整列
sort
配列を昇順に整列します。
import numpy as np
x = np.array([9, 10, 4, 5, 3, 7, 12, 2, 6, 0])
s = np.sort(x)
print(s)
【実行結果】
[ 0 2 3 4 5 6 7 9 10 12]
argsort
配列を昇順に整列して、インデックスを返します。
import numpy as np
x = np.random.random((3, 4))
n = np.argsort(x)
print(x)
print(n)
【実行結果】
[[0.20887676 0.16130952 0.65310833 0.2532916 ]
[0.46631077 0.24442559 0.15896958 0.11037514]
[0.65632959 0.13818295 0.19658236 0.36872517]]
[[1 0 3 2]
[3 2 1 0]
[1 2 3 0]]
配列の並び替え
permutation
与えられた数字または配列をランダムに並べ替えます。
permutation( 数字or配列 )
※0から与えられた数字(整数)がランダムに並べ替えられる。
※与えられた配列をランダムに並べ替えて、その配列を返り値として渡す。
import numpy as np
np.random.permutation(10)
【実行結果】
array([1, 5, 7, 0, 9, 4, 3, 6, 8, 2])
【例】引数が配列の場合
import numpy as np
x = np.random.rand(5)
y = np.random.permutation(x)
print(x)
print(y)
【実行結果】
[0.8176835 0.23770013 0.11311803 0.4023326 0.97460666]
[0.11311803 0.8176835 0.97460666 0.23770013 0.4023326 ]
partition
指定された順位よりも小さい数字と大きい数字に並び替える。
k番目までの大きさの要素を前に配置、k+1番目以降は後ろに置き換える(整列はされない)。
import numpy as np
a = np.array([2, 3, 5, 4, 1, 7, 6])
p = np.partition(a, 3)
print(p)
【実行結果】
[3 2 1 4 5 7 6]
argpartition
指定された順位よりも小さい数字と大きい数字に並び替え、その時のインデックスを返す。
k番目までの大きさの要素を前に配置、k+1番目以降は後ろに置き換える(整列はされない)。
import numpy as np
np.random.seed(0)
x = np.random.random((7))
p = np.partition(x,2)
ap = np.argpartition(x,2)
print(x)
print(p)
print(ap)
【実行結果】
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 0.64589411
0.43758721]
[0.4236548 0.43758721 0.54488318 0.60276338 0.5488135 0.64589411
0.71518937]
[4 6 3 2 0 5 1]
配列の探索
searchsorted
ソート済み配列に対して二分木探索をして挿入位置を探索しインデックスを返します。
searchsorted( a, v, side=’left’ )
a | 探索対象の配列 |
v | aに挿入する値 |
side | (オプション)’left’と’right’があります。 left:a[i-1] < v <= a[i] ritht:a[i-1] <= v < a[i] |
import numpy as np
y = np.linspace(-5, 5, 20)
x = np.searchsorted(y, 2)
print(y)
print(x)
【実行結果】
[-5. -4.47368421 -3.94736842 -3.42105263 -2.89473684 -2.36842105
-1.84210526 -1.31578947 -0.78947368 -0.26315789 0.26315789 0.78947368
1.31578947 1.84210526 2.36842105 2.89473684 3.42105263 3.94736842
4.47368421 5. ]
14
こちらのサイトを参考にしました。