私は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配列の各行に対して操作を実行するにはどうすればよいですか?
どうぞ。 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]])
既に述べたように、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
は問題ありませんが、希望する答えが得られないことに注意してください。 array
の各columnを(各rowの代わりに)vector
の対応する各要素で除算します。 vector
を1x3
ではなく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は同じ内部メモリのビューを使用して再整形するだけなので、効率的です。
これを行うPythonの方法は...
np.divide(data,vector)
これにより再整形が行われ、結果も浮動小数点形式になります。他の回答では、結果は丸められた整数形式です。
#NOTE:データとベクターの両方の列が一致する必要はありません