2つのベクトルの差からNumPy行列を作成する 質問する

2つのベクトルの差からNumPy行列を作成する 質問する

numpy関数から行列を構築することは可能ですか? この場合、関数は具体的には 2 つのベクトルの絶対差です: S[i,j] = abs(A[i] - B[j])。通常の Python を使用した最小限の動作例:

import numpy as np

A = np.array([1,3,6])
B = np.array([2,4,6])
S = np.zeros((3,3))

for i,x in enumerate(A):
    for j,y in enumerate(B):
        S[i,j] = abs(x-y)

寄付:

[[ 1.  3.  5.]
 [ 1.  1.  3.]
 [ 4.  2.  0.]]

次のような構造があると便利です。

def build_matrix(shape, input_function, *args)

ここでは、入力関数とその引数を渡して、NumPy の速度の利点を維持できます。

ベストアンサー1

@JoshAdelが提案したことに加えて、outer方法ufunc2 つの配列がある場合にブロードキャストを実行するための任意の numpy です。

この場合、必要なのはnp.subtract.outer(A, B)(または、むしろその絶対値) だけです。

この例ではどちらもかなり読みやすいですが、ブロードキャストの方が便利な場合もあれば、ufunc メソッドを使用する方がわかりやすい場合もあります。

いずれにせよ、両方のトリックを知っておくと便利です。

例えば

import numpy as np

A = np.array([1,3,6])
B = np.array([2,4,6])

diff = np.subtract.outer(A, B)
result = np.abs(diff)

outer基本的に、、、、accumulateを、、、、または、などの任意のnumpy と一緒にreduce使用できます。reduceatufuncsubtractmultiplydividelogical_and

たとえば、np.cumsumは と同等ですnp.add.accumulate。つまり、必要であれば のようなものcumdivを で実装することもできます。np.divide.accumulate

おすすめ記事