2017-09-13 53 views
1

我有2個numpy陣列形狀(5,1)說: a = [1,2,3,4,5] b = [2,4,2, 3,6]Numpy multiply array into matrix(outer product)

如何使矩陣乘以每個第i個元素與每個第j個?像:

..a = [1,2,3,4,5] 
b 
2 2, 4, 6, 8,10 
4 4, 8,12,16,20 
2 2, 4, 6, 8,10 
3 3, 6, 9,12,15 
6 6,12,18,24,30 

沒有使用forloops?我可以使用任何重塑,縮小或乘法的組合嗎?

現在我創建一個a * b平鋪每個數組沿着行和沿着列,然後乘以元素明智,但在我看來,必須有一個更簡單的方法。

+0

你想兩個數組的外積:https://stackoverflow.com/questions/27809511/efficient-outer-product-in-python –

回答

2

隨着numpy.outer()numpy.transpose()和例程:

import numpy as np 

a = [1,2,3,4,5] 
b = [2,4,2,3,6] 
c = np.outer(a,b).transpose() 

print(c) 

,或只與交換陣列順序:

c = np.outer(b, a) 

輸出;

[[ 2 4 6 8 10] 
[ 4 8 12 16 20] 
[ 2 4 6 8 10] 
[ 3 6 9 12 15] 
[ 6 12 18 24 30]] 
+0

謝謝!這工作。如果您有任何建議讓問題更容易理解,請讓我知道。我忘了這被稱爲外部產品fo矢量。 –

+0

@ZloySmiertniy,歡迎,我會添加*(外部產品)*在標題的末尾+格式代碼 – RomanPerekhrest

1

出於某種原因np.multiply.outer似乎比np.outer對小投入快。廣播仍然更快 - 但對於更大的陣列,它們幾乎都是平等的。

%timeit np.outer(a,b) 
%timeit np.multiply.outer(a,b) 
%timeit a[:, None]*b 

100000 loops, best of 3: 5.97 µs per loop 
100000 loops, best of 3: 3.27 µs per loop 
1000000 loops, best of 3: 1.38 µs per loop 

a = np.random.randint(0,10,100) 
b = np.random.randint(0,10,100) 

%timeit np.outer(a,b) 
%timeit np.multiply.outer(a,b) 
%timeit a[:, None]*b 

100000 loops, best of 3: 15.5 µs per loop 
100000 loops, best of 3: 14 µs per loop 
100000 loops, best of 3: 13.5 µs per loop 

a = np.random.randint(0,10,10000) 
b = np.random.randint(0,10,10000) 

%timeit np.outer(a,b) 
%timeit np.multiply.outer(a,b) 
%timeit a[:, None]*b 

10 loops, best of 3: 154 ms per loop 
10 loops, best of 3: 154 ms per loop 
10 loops, best of 3: 152 ms per loop 
+0

聽起來很有趣。我正在使用的矩陣非常大,像100K元素的90K倍,所以也許不會有任何變化 –