サーチ…
前書き
N次元の配列またはndarrays
は、numpyのコアオブジェクトで、同じデータ型の項目を格納するために使用されます。これらは、通常のPythonの配列より優れた効率的なデータ構造を提供します。
備考
可能な限り、配列やベクトル演算の観点からデータに対する演算を表現する。ベクトル操作は、同等のループよりもはるかに高速に実行されます
配列の作成
空の配列
np.empty((2,3))
この場合、この配列の値は設定されていないことに注意してください。したがって、配列を作成するこの方法は、配列が後でコードに埋め込まれる場合にのみ有効です。
リストから
np.array([0,1,2,3])
# Out: array([0, 1, 2, 3])
範囲を作成する
np.arange(4)
# Out: array([0, 1, 2, 3])
ゼロを作成する
np.zeros((3,2))
# Out:
# array([[ 0., 0.],
# [ 0., 0.],
# [ 0., 0.]])
作成する
np.ones((3,2))
# Out:
# array([[ 1., 1.],
# [ 1., 1.],
# [ 1., 1.]])
線形の配列アイテムを作成する
np.linspace(0,1,21)
# Out:
# array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 ,
# 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85,
# 0.9 , 0.95, 1. ])
ログ間隔のある配列アイテムを作成する
np.logspace(-2,2,5)
# Out:
# array([ 1.00000000e-02, 1.00000000e-01, 1.00000000e+00,
# 1.00000000e+01, 1.00000000e+02])
指定された関数から配列を作成する
np.fromfunction(lambda i: i**2, (5,))
# Out:
# array([ 0., 1., 4., 9., 16.])
np.fromfunction(lambda i,j: i**2, (3,3))
# Out:
# array([[ 0., 0., 0.],
# [ 1., 1., 1.],
# [ 4., 4., 4.]])
配列演算子
x = np.arange(4)
x
#Out:array([0, 1, 2, 3])
スカラー加算は要素的に賢明です
x+10
#Out: array([10, 11, 12, 13])
スカラー倍は要素的に賢明です
x*2
#Out: array([0, 2, 4, 6])
配列の追加は要素的に賢明です
x+x
#Out: array([0, 2, 4, 6])
配列の乗算は要素的に賢明です
x*x
#Out: array([0, 1, 4, 9])
ドット積(または、より一般的には行列乗算)は、関数
x.dot(x)
#Out: 14
Python 3.5では、 @
演算子が行列乗算の中置演算子として追加されました
x = np.diag(np.arange(4))
print(x)
'''
Out: array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3]])
'''
print(x@x)
print(x)
'''
Out: array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 4, 0],
[0, 0, 0, 9]])
'''
追加します。値を付加したコピーを返します。インプレースではありません。
#np.append(array, values_to_append, axis=None)
x = np.array([0,1,2,3,4])
np.append(x, [5,6,7,8,9])
# Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x
# Out: array([0, 1, 2, 3, 4])
y = np.append(x, [5,6,7,8,9])
y
# Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
hstack 。水平スタック。 (カラムスタック)
vstack 。垂直スタック。 (行スタック)
# np.hstack(tup), np.vstack(tup)
x = np.array([0,0,0])
y = np.array([1,1,1])
z = np.array([2,2,2])
np.hstack(x,y,z)
# Out: array([0, 0, 0, 1, 1, 1, 2, 2, 2])
np.vstack(x,y,z)
# Out: array([[0, 0, 0],
# [1, 1, 1],
# [2, 2, 2]])
配列アクセス
スライスシンタックスはi:j:k
であり、 i
は開始インデックス(両端を含む)、 j
は停止インデックス(除外)、 k
はステップサイズです。他のPythonデータ構造体と同様に、最初の要素のインデックスは0です。
x = np.arange(10)
x[0]
# Out: 0
x[0:4]
# Out: array([0, 1, 2, 3])
x[0:4:2]
# Out:array([0, 2])
負の値は配列の最後から数えられます。 -1
は配列の最後の要素にアクセスします:
x[-1]
# Out: 9
x[-1:0:-1]
# Out: array([9, 8, 7, 6, 5, 4, 3, 2, 1])
多次元配列は、各次元をコンマで区切って指定することによってアクセスできます。これまでのルールはすべて適用されます。
x = np.arange(16).reshape((4,4))
x
# Out:
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
x[1,1]
# Out: 5
x[0:3,0]
# Out: array([0, 4, 8])
x[0:3, 0:3]
# Out:
# array([[ 0, 1, 2],
# [ 4, 5, 6],
# [ 8, 9, 10]])
x[0:3:2, 0:3:2]
# Out:
# array([[ 0, 2],
# [ 8, 10]])
配列の転置
arr = np.arange(10).reshape(2, 5)
.transpose
メソッドを使う:
arr.transpose()
# Out:
# array([[0, 5],
# [1, 6],
# [2, 7],
# [3, 8],
# [4, 9]])
.T
メソッド:
arr.T
# Out:
# array([[0, 5],
# [1, 6],
# [2, 7],
# [3, 8],
# [4, 9]])
またはnp.transpose
:
np.transpose(arr)
# Out:
# array([[0, 5],
# [1, 6],
# [2, 7],
# [3, 8],
# [4, 9]])
2次元配列の場合、これは(上記のように)標準的な行列の転置と同等です。 n次元の場合、配列軸の置換を指定することができます。デフォルトでは、これはarray.shape
逆にしarray.shape
:
a = np.arange(12).reshape((3,2,2))
a.transpose() # equivalent to a.transpose(2,1,0)
# Out:
# array([[[ 0, 4, 8],
# [ 2, 6, 10]],
#
# [[ 1, 5, 9],
# [ 3, 7, 11]]])
しかし、軸インデックスの任意の置換が可能です:
a.transpose(2,0,1)
# Out:
# array([[[ 0, 2],
# [ 4, 6],
# [ 8, 10]],
#
# [[ 1, 3],
# [ 5, 7],
# [ 9, 11]]])
a = np.arange(24).reshape((2,3,4)) # shape (2,3,4)
a.transpose(2,0,1).shape
# Out:
# (4, 2, 3)
ブールインデックス
arr = np.arange(7)
print(arr)
# Out: array([0, 1, 2, 3, 4, 5, 6])
スカラーとの比較はboolean配列を返します:
arr > 4
# Out: array([False, False, False, False, False, True, True], dtype=bool)
この配列を使用して、4より大きい数字のみを選択することができます。
arr[arr>4]
# Out: array([5, 6])
ブールインデックスは、異なる配列間で使用できます(例:関連する並列配列)。
# Two related arrays of same length, i.e. parallel arrays
idxs = np.arange(10)
sqrs = idxs**2
# Retrieve elements from one array using a condition on the other
my_sqrs = sqrs[idxs % 2 == 0]
print(my_sqrs)
# Out: array([0, 4, 16, 36, 64])
配列の形状変更
numpy.reshape
(同じnumpy.ndarray.reshape
)メソッドは、同じ合計サイズの配列を返すが、新しい形状:
print(np.arange(10).reshape((2, 5)))
# [[0 1 2 3 4]
# [5 6 7 8 9]]
新しい配列を返し、その場で動作しません:
a = np.arange(12)
a.reshape((3, 4))
print(a)
# [ 0 1 2 3 4 5 6 7 8 9 10 11]
ただし、 ndarray
shape
属性を上書きすることは可能ndarray
。
a = np.arange(12)
a.shape = (3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
この動作は最初は驚くかもしれませんが、 ndarray
は連続したメモリブロックに格納され、そのshape
はこのデータストリームを多次元オブジェクトとしてどのように解釈するかを指定するだけです。
shape
タプル内の最大1つの軸の値は-1
ます。 numpy
はあなたのためにこの軸の長さを推測します:
a = np.arange(12)
print(a.reshape((3, -1)))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
または:
a = np.arange(12)
print(a.reshape((3, 2, -1)))
# [[[ 0 1]
# [ 2 3]]
# [[ 4 5]
# [ 6 7]]
# [[ 8 9]
# [10 11]]]
a.reshape((3, -1, -1))
などの複数の指定されていないディメンションは許可されず、 ValueError
をスローします。
アレイ操作のブロードキャスト
算術演算はNumpy配列で要素単位で実行されます。同じ形状の配列の場合、対応するインデックスの要素間で操作が実行されることを意味します。
# Create two arrays of the same size
a = np.arange(6).reshape(2, 3)
b = np.ones(6).reshape(2, 3)
a
# array([0, 1, 2],
# [3, 4, 5])
b
# array([1, 1, 1],
# [1, 1, 1])
# a + b: a and b are added elementwise
a + b
# array([1, 2, 3],
# [4, 5, 6])
算術演算は、ナンシー(Numpy) 放送によって異なる形状の配列に対して実行することもできる。一般に、一方の配列は他方の要素の上に「ブロードキャスト」されているので、要素の操作は一致する形状のサブ配列に対して実行されます。
# Create arrays of shapes (1, 5) and (13, 1) respectively
a = np.arange(5).reshape(1, 5)
a
# array([[0, 1, 2, 3, 4]])
b = np.arange(4).reshape(4, 1)
b
# array([0],
# [1],
# [2],
# [3])
# When multiplying a * b, slices with the same dimensions are multiplied
# elementwise. In the case of a * b, the one and only row of a is multiplied
# with each scalar down the one and only column of b.
a*b
# array([[ 0, 0, 0, 0, 0],
# [ 0, 1, 2, 3, 4],
# [ 0, 2, 4, 6, 8],
# [ 0, 3, 6, 9, 12]])
これをさらに説明するために、2Dアレイと3Dアレイを合同のサブディメンションで乗算することを検討してください。
# Create arrays of shapes (2, 2, 3) and (2, 3) respectively
a = np.arange(12).reshape(2, 2, 3)
a
# array([[[ 0 1 2]
# [ 3 4 5]]
#
# [[ 6 7 8]
# [ 9 10 11]]])
b = np.arange(6).reshape(2, 3)
# array([[0, 1, 2],
# [3, 4, 5]])
# Executing a*b broadcasts b to each (2, 3) slice of a,
# multiplying elementwise.
a*b
# array([[[ 0, 1, 4],
# [ 9, 16, 25]],
#
# [[ 0, 7, 16],
# [27, 40, 55]]])
# Executing b*a gives the same result, i.e. the smaller
# array is broadcast over the other.
配列放送はいつ適用されますか?
放送は、2つのアレイが互換性のある形状を有するときに行われる。
シェイプは、末尾のものから順にコンポーネントごとに比較されます。 2つのディメンションは、同じものか1つが1
場合に互換性があります。一方の形状が他方の形状よりも高い寸法を有する場合、超過する成分は比較されない。
互換性のある形状の例:
(7, 5, 3) # compatible because dimensions are the same
(7, 5, 3)
(7, 5, 3) # compatible because second dimension is 1
(7, 1, 3)
(7, 5, 3, 5) # compatible because exceeding dimensions are not compared
(3, 5)
(3, 4, 5) # incompatible
(5, 5)
(3, 4, 5) # compatible
(1, 5)
配列にCSVファイルの内容を設定する
filePath = "file.csv"
data = np.genfromtxt(filePath)
多くのオプションがサポートされています。 公式ドキュメントを参照してください:
data = np.genfromtxt(filePath, dtype='float', delimiter=';', skip_header=1, usecols=(0,1,3) )
ナンパーのn次元配列:ndarray
numpyの中核となるデータ構造は、 ndarray
( n次元配列の略)です。 ndarray
のは
- 均質(すなわち、それらは同じデータ型の項目を含む)
- 固定サイズの項目を含む( 形状 、各次元のサイズを指定するn個の正の整数のタプルによって与えられる)
1次元配列:
x = np.arange(15)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
x.shape
# (15,)
2次元配列:
x = np.asarray([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
x
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
x.shape
# (3, 5)
3次元:
np.arange(12).reshape([2,3,2])
内容を指定せずに配列を初期化するには、次のようにします。
x = np.empty([2, 2])
# array([[ 0., 0.],
# [ 0., 0.]])
データ型推測と自動キャスティング
データ型はデフォルトでfloatに設定されています
x = np.empty([2, 2])
# array([[ 0., 0.],
# [ 0., 0.]])
x.dtype
# dtype('float64')
いくつかのデータが提供されている場合、numpyはデータ型を推測します:
x = np.asarray([[1, 2], [3, 4]])
x.dtype
# dtype('int32')
代入を行うとき、numpyはndarray
のデータ型に合わせて自動的に値をキャストしようとします
x[1, 1] = 1.5 # assign a float value
x[1, 1]
# 1
# value has been casted to int
x[1, 1] = 'z' # value cannot be casted, resulting in a ValueError
配列放送
アレイ操作のブロードキャストも参照してください。
x = np.asarray([[1, 2], [3, 4]])
# array([[1, 2],
[3, 4]])
y = np.asarray([[5, 6]])
# array([[5, 6]])
行列の用語では、2x2行列と1x2行ベクトルがあります。それでも私たちは合計を行うことができます
# x + y
array([[ 6, 8],
[ 8, 10]])
これは、配列y
が「 伸びた 」ためです:
array([[5, 6],
[5, 6]])
x
の形に合わせて
リソース:
- 公式文書からのndarrayの紹介: N次元配列(ndarray)
- クラス参照: ndarray