2

次のような np.arrays のリストがあります。

l = [array([0.2,0.3,0.5]),array([0.7,0.3])]

外積を取得するために必要なもの:

array([[0.14, 0.06],
       [0.21, 0.09],
       [0.35, 0.15]])

一般的な方法:

array([[l[0][0] * l[1][0], l[0][0] * l[1][1]],
       [l[0][1] * l[1][0], l[0][1] * l[1][1]],
       [l[0][2] * l[1][0], l[0][2] * l[1][1]]])

しかし、任意の長さの l (>= 2) の場合、len(l) == 4 の場合、4 次元配列が得られます。

私の現在のアプローチは、for ループで tensordot を使用することです。

product = np.tensordot(l[0], l[1], 0)
for i in range(2, len(l)):
    product = np.tensordot(product, l[i], 0)

しかし、私はPythonコードの方が見栄えが良いことに慣れています。より優れた、より高速なソリューションを実行する方法を考えている人はいますか?

動機は、要素ごとに乗算された 2 つの配列の合計を取得する必要があることです。

result = np.sum(arr * product)

どこで arr.shape == product.shape. 賢い人たちなら、それを改善できるかもしれません。

4

2 に答える 2

2

おそらくもっと簡潔です:

reduce(lambda x, y: tensordot(x, y, 0), l)
于 2013-04-26T21:07:40.497 に答える
0

numpy には、ブロードキャストと呼ばれる優れた機能があり、配列を反復処理します。したがって、x x 1 の配列があり、それに 1 x y の配列を掛けると、x x y の配列が得られます。行列のように機能します。だから私はたった2行であなたが望むすべてをするつもりです:

result = np.array((l[0])).reshape((1,len(l[0])))# resizing the first column to make it a 3 by 1 so that numpy broadcasting will work.
print result * l[1] # broadcasting the 3 by 1 by a 1 by 2 to result in your 3 by 2 

そして、あなたはそれを持っています!早くて簡単!便宜上、コード全体を以下に示します。

import numpy as np
l = [([0.2,0.3,0.5]),([0.7,0.3])]
result = np.array((l[0])).reshape((len(l[0]),1))
print result * l[1]
>>>>aray([[ 0.14  0.06]
 [ 0.21  0.09]
 [ 0.35  0.15]])
于 2013-04-27T12:38:14.390 に答える