12

Numpy 配列ブロードキャストでの次の演習を検討してください。

import numpy as np
v = np.array([[1.0, 2.0]]).T # column array

A2 = np.random.randn(2,10) # 2D array
A3 = np.random.randn(2,10,10) # 3D

v * A2 # works great

# causes error: 
v * A3 # error

ブロードキャストの Numpy ルールを知っておりbsxfun、Matlab の機能に精通しています。(2,1) 配列を (2,N,N) 配列にブロードキャストしようとして失敗する理由と、この前に (2,1) 配列を (2,1,1) 配列に再形成する必要があることを理解しています放送が通ります。

私の質問は次のとおりです。ブロードキャストを試みるときに、必要な次元を具体的に伝えることなく、配列の次元を自動的にパディングするように Python に指示する方法はありますか?

(2,1) ベクトルを、それがブロードキャストされる多次元配列と明示的に結合したくありませmult_v_A = lambda v,A: v.reshape([v.size] + [1]*(A.ndim-1)) * A。「A」配列が 2D なのか 3D なのか ND なのかは事前にわかりません。

Matlab のbsxfunブロードキャスト機能は、必要に応じて次元を暗黙的にパディングするので、Python で何かできることを期待しています。

4

2 に答える 2

9

NumPy ブロードキャストは、左側に追加の軸を追加します。

したがって、共有軸が右側にあり、ブロードキャスト可能な軸が左側になるように配列を配置すると、問題なくブロードキャストを使用できます。

import numpy as np
v = np.array([[1.0, 2.0]])  # shape (1, 2)

A2 = np.random.randn(10,2) # shape (10, 2)
A3 = np.random.randn(10,10,2) # shape (10, 10, 2)

v * A2  # shape (10, 2)

v * A3 # shape (10, 10, 2)
于 2013-07-10T17:59:07.343 に答える