Numpy★配列の便利な関数

2021年10月7日

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

数字又は配列を指定回数コピーします。

書き方

repeat( a, repeats, axis )

aコピー対象の配列または数字
repeatsコピーする回数
axis(オプション)コピーする軸方向

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言語

reshape詳細

【例】
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

指定された配列の転置を行います、また軸の順番を指定した通りに入れ替えます。

書き方

transpose( a, axes )

a転置したい配列
axes(オプション)軸の順番を指定

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, … ] )

【例】
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])

配列の分割

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

配列を昇順に整列します。

書き方

sort( a, axis )

a配列
axis(オプション)整列する軸方向

※降順で並び替える時はsort(a)[::-1]のようにするとよい。

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

配列を昇順に整列して、インデックスを返します。

書き方

argsort( a, axis )

a配列
axis(オプション)整列する軸方向

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から与えられた数字(整数)がランダムに並べ替えられる。
※与えられた配列をランダムに並べ替えて、その配列を返り値として渡す。

permutation 詳細

【例】引数が数字の場合
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番目以降は後ろに置き換える(整列はされない)。

書き方

partition( a, kth, axis )

a配列
kth整数
axis(オプション)並び替える軸方向

partition 詳細

【例】3(インデックス番号)番目までの大きさを前に、それ以降を後ろに配置
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番目以降は後ろに置き換える(整列はされない)。

書き方

argpartition( a, kth, axis )

a配列
kth整数
axis(オプション)並び替える軸方向

argpartition 詳細

【例】2(インデックス番号)番目までの大きさを前に、それ以降を後ろに配置
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探索対象の配列
vaに挿入する値
side(オプション)’left’と’right’があります。
left:a[i-1] < v <= a[i]
ritht:a[i-1] <= v < a[i]

searchsorted 詳細

【例】
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

こちらのサイトを参考にしました。

NumPy配列

Posted by Bright_Noah