回答:
どうぞ。ブロードキャストと組み合わせて使用する必要があります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.newaxis
ます。私はあなたのセットアップが何であるか、またはあなたが経験している正確な問題を知りませんが、答えはまだ有効です。
すでに述べたように、with None
またはwith を使用したスライスnp.newaxes
は、これを行うための優れた方法です。別の選択肢は、次のようにトランスポーズとブロードキャストを使用することです
(data.T - vector).T
そして
(data.T / vector).T
より高次元の配列の場合はswapaxes
、NumPy配列のメソッドまたは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
なく)の各列を、の対応する各要素で除算します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]])
これを行うPythonicの方法は...
np.divide(data.T,vector).T
これにより、形状変更が行われ、結果は浮動小数点形式になります。他の回答では、結果は丸められた整数形式です。
#注:データとベクトルの両方の列が一致する必要があります
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は同じ内部メモリのビューを使用して再形成するだけなので、効率的でもあります。
.reshape(-1,1)
は、ブロードキャストを使用する最も直感的な方法です。