2

効率化のために、次のループをベクトル化したいと考えています。

A = np.array([[0., 1., 0., 2.],
              [1., 0., 3., 0.],
              [0., 0., 0., 4.],
              [2., 0., 4., 0.]]) # quadratic, not symmetric Matrix, shape (i, i)
B = np.array([2., 4., 2., 1.]) # vector shape (i)
C = np.zeros(A.shape) # Result Matrix 
# classical Loop:
for i in range(len(B)):
    for j in range(len(B)):
        C[i, j] = A[i, j]*(B[i]-B[j])

Mathcad のようなベクトル化を使用する私の最初の試みは、私が望むものではありません。

i = np.arange(len(B))
j = np.arange(len(B))
C[i,j] = A[i,j]*(B[i]-B[j]) # this fails to do what I want

私の2回目の試みはそれを行うための最良の方法ですか、それとももっと簡単で自然な「numpyの方法」がありますか?

idx = np.indices(A.shape)
C[idx] = A[idx]*(B[idx[0]]-B[idx[1]])
4

1 に答える 1

2

以下はあなたが望むことをします:

A = np.array([[0., 1., 0., 2.],
             [1., 0., 3., 0.],
             [0., 0., 0., 4.],
             [2., 0., 4., 0.]]) # quadratic, not symmetric Matrix, shape (i, i)
B = np.array([2., 4., 2., 1.]) # vector shape (i)

C = A*(B[:,None]-B)

Cは

array([[ 0., -2.,  0.,  2.],
       [ 2.,  0.,  6.,  0.],
       [ 0., -0.,  0.,  4.],
       [-2., -0., -4.,  0.]])

少し説明: shape の列ベクトルに
B[:,None]変換します。単純に乗算できる 4x4 マトリックスに結果を自動的にブロードキャストします。B[4,1]B[:,None]-BA

于 2013-04-22T09:18:59.767 に答える