gijyutsu-keisan.com

2.4.Numpy配列の形状変更

  1. reshapeメソッド
  2. newaxisメソッド

(1)reshapeメソッド

  • A.reshape(shape)
shape 配列のサイズを指定します。 二次以上は(*, *)(タプル)で指定します。
>>> np.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> np.arange(1,10).reshape((3,3))
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

節はじめに戻る


(2)newaxisメソッド

  • A[newaxis,:](Numpy一次配列を行ベクトルに変換)
  • A[:,newaxis](Numpy一次配列を列ベクトルに変換)
Numpy一次配列を行ベクトル(1×*行列)に変換します。
>>> vec=np.array([1,2,3])
>>> vec[np.newaxis,:]
array([[1, 2, 3]])
Numpy一次配列を列ベクトル(*×1行列)に変換します。
>>> vec=np.array([1,2,3])
>>> vec[:,np.newaxis]
array([[1],
[2],
[3]])

節はじめに戻る

2.5.Numpy配列の結合・分解

  1. 横方向の結合
  2. 縦方向の結合
  3. 深さ方向
  4. 任意方向の結合
  5. 分解

(1)横方向の結合

  • numpy.hstack((array, array, ...))
横(列)方向でNumpy配列の結合を行います。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5])
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5])
多次元配列でも横(列)方向の結合できます。
例えば2つの行列を結合させるとき、それらの行数を合わせる必要があります。
#2×3行列と2×1行列の列方向結合(2×4行列)
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> b = np.array([[0],[0]])
>>> b
array([[0],
[0]])
>>> np.hstack((a,b))
array([[1, 2, 3, 0],
[4, 5, 6, 0]])


#3次元列ベクトルどうしの結合(3×2行列)
>>> a = np.array([[1],[2],[3]])
>>> a
array([[1],
[2],
[3]])

>>> b = np.array([[4],[5],[6]])
>>> b
array([[4],
[5],
[6]])

>>> np.hstack((a,b))
array([[1, 4],
[2, 5],
[3, 6]])

節はじめに戻る


(2)縦方向の結合

  • numpy.vstack((array, array, ...))
縦(行)方向でNumpy配列を結合します 多次元配列でも縦(行)方向の結合できます。
例えば2つの行列を結合させるとき、それらの列数を合わせる必要があります。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.vstack((a,b))
array([[1, 2, 3],
[4, 5, 6]])

>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[4],[5],[6]])
>>> np.vstack((a,b))
array([[1],
[2],
[3],
[4],
[5],
[6]])

節はじめに戻る


(3)深さ方向

  • numpy.dstack((array, array, ...))
配列を一次元深くして結合します。
>>> a = np.array([0,1,2])
>>> b = np.array([3,4,5])
>>> np.dstack((a,b))
array([[[0, 3],
[1, 4],
[2, 5]]])

>>> a = np.array([[1],[2],[3]])
>>> a
array([[1],
[2],
[3]])

>>> b = np.array([[4],[5],[6]])
>>> b
array([[4],
[5],
[6]])

>>> np.dstack((a,b))
array([[[1, 4]],

[[2, 5]],

[[3, 6]]])

節はじめに戻る


(4)任意方向の結合

  • numpy.concatenate((array, array, ...), axis = 0)
(array, array, ...) 結合したい配列を指定します。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6]])
>>> np.concatenate((a,b))
array([[1, 2],
[3, 4],
[5, 6]])

>>> b = np.array([[5],[6]])
>>> np.concatenate((a,b),axis=1)
array([[1, 2, 5],
[3, 4, 6]])

  • numpy.stack(arrays, axis = 0)
(array, array, ...) 結合したい配列を指定します。 指定した配列は同じ型(shape)でなければなりません。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])

>>> np.stack((a,b))
array([[1, 2, 3],
[4, 5, 6]])

>>> np.stack((a,b),axis=1)
array([[1, 4],
[2, 5],
[3, 6]])

節はじめに戻る


(5)分解

  • 指定方向の分解:numpy.split(array, indices or sections, axis = 0)
  • 行方向の分解:numpy.vsplit(array, indices or sections)
  • 列方向の分解:numpy.hsplit(array, indices or sections)
  • 深さ方向の分解:numpy.dsplit(array, indices or sections)
array 分割したい配列を指定します。
indices or sections 分割したい配列要素数が割り切れる数で指定します。 割り切れない場合はエラーが出ます。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。

#一次配列
>>> a = np.array([0,1,2,3,4,5,6,7,8])

>>> np.split(a,3)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

#上記と同じ結果が得られます。
>>> np.hsplit(a,3)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

#indices or sectionsで配列要素数が割り切れない場合、エラーがでます。
>>> np.hsplita(a,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'numpy' has no attribute 'hsplita'

#多次元配列
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

>>> np.hsplit(a,3)
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]

>>> np.vsplit(a,3)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

#axis = 1を指定することでvsplitと同じ結果が得られます。
>>> np.split(a,3,axis=1)
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]

節はじめに戻る

参考文献

関連ページ