web-dev-qa-db-ja.com

Numpy:各行をベクトル要素で割ります

私はnumpy配列を持っていると仮定します:

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

対応する「ベクター」があります。

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

各行に沿ってdataを操作して、結果を次のように減算または除算するにはどうすればよいですか?

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]

簡単な説明:各行に対応する1D配列のスカラーを使用して、2D配列の各行に対して操作を実行するにはどうすればよいですか?

95
BFTM

どうぞ。 None(またはnp.newaxis)をブロードキャストと組み合わせて使用​​するだけです。

In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
150
JoshAdel

既に述べたように、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 を参照してください

10
IanH

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は問題ありませんが、希望する答えが得られないことに注意してください。 arrayの各columnを(各rowの代わりに)vectorの対応する各要素で除算します。 vector1x3ではなく3x1に明示的に再構成した場合に得られるものです。

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)

これにより、ベクターがcolumn matrix/vectorに変わります。必要に応じて要素ごとの操作を実行できます。少なくとも私にとって、これは最も直感的な方法であり、(ほとんどの場合)numpyは同じ内部メモリのビューを使用して再整形するだけなので、効率的です。

0
meow

これを行うPythonの方法は...

np.divide(data,vector)

これにより再整形が行われ、結果も浮動小数点形式になります。他の回答では、結果は丸められた整数形式です。

#NOTE:データとベクターの両方の列が一致する必要はありません

0
shantanu pathak