仮にnumpyの配列があるとします:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
と、対応する"vector:"を持っています;
vector = np.array([1,2,3])
各行のデータに対して、引き算や割り算を行うにはどうすればよいのでしょうか:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
長くなりましたが、2D配列の各行に対して、各行に対応するスカラーの1D配列で演算を行うにはどうすればよいでしょうか。
すでに述べたように、None
やnp.newaxes
を使ったスライスは、これを実現するための素晴らしい方法です。
また、次のように転置や放送を利用する方法もあります。
(data.T - vector).T
と
(data.T / vector).T
高次元の配列の場合は、NumPy の配列の swapaxes
メソッドや NumPy の rollaxis
関数を使用するとよいでしょう。
このように、本当にたくさんの方法があるのです。
放送に関する詳しい解説は http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
JoshAdel'のソリューションは、np.newaxisを使って次元を追加しています。別の方法としては,reshape()で放送に備えて寸法を揃える方法がある.
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data
# array([[1, 1, 1],
# [2, 2, 2],
# [3, 3, 3]])
vector
# array([1, 2, 3])
data.shape
# (3, 3)
vector.shape
# (3,)
data / vector.reshape((3,1))
# array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])
reshape()を実行することで、放送用の寸法を揃えることができます:
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
なお、data/vector
はOKですが、望むような答えは得られません。これは array
の各 列 を (各 行 の代わりに) vector
の対応する各要素で分割しています。これは vector
を 3x1
ではなく 1x3
になるように明示的に整形した場合に得られるものである。
data / vector
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
stackoverflowuser2010の回答に加えて、一般的なケースでは、そのまま使用できます。
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
これにより、ベクトルが「列行列/ベクトル」に変わります。 必要に応じて要素ごとの操作を実行できます。 少なくとも私にとっては、これはそれについて取り組む最も直感的な方法であり、(ほとんどの場合)numpyは同じ内部メモリのビューを使用して、それを効率的に再形成するだけなので、.