2017-09-13 51 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倍,所以也许不会有任何变化 –