Fom*_*aut 2 python arrays numpy multiplication python-2.7
我有两个numpy数组:
x = numpy.array([1, 2])
y = numpy.array([3, 4])
Run Code Online (Sandbox Code Playgroud)
我想创建一个元素矩阵产品:
[[3, 6],
[4, 8]]
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?
一种方法是使用outer函数np.multiply(如果你想要与你的问题中的顺序相同,则转置):
>>> np.multiply.outer(x, y).T
array([[3, 6],
[4, 8]])
Run Code Online (Sandbox Code Playgroud)
在NumPy的大多数ufuncs有这个有用的outer功能(add,subtract,divide等).正如@Akavall所暗示的,np.outer这里的乘法情况相当.
或者,np.einsum可以一次执行乘法和转置:
>>> np.einsum('i,j->ji', x, y)
array([[3, 6],
[4, 8]])
Run Code Online (Sandbox Code Playgroud)
第三种方法是在一个数组中插入一个新轴然后相乘,尽管这有点冗长:
>>> (x[:, np.newaxis] * y).T
array([[3, 6],
[4, 8]])
Run Code Online (Sandbox Code Playgroud)
对于那些对性能感兴趣的人,以下是两个长度为15的数组的操作时序,从最快到最慢:
In [70]: x = np.arange(15)
In [71]: y = np.arange(0, 30, 2)
In [72]: %timeit np.einsum('i,j->ji', x, y)
100000 loops, best of 3: 2.88 µs per loop
In [73]: %timeit np.multiply.outer(x, y).T
100000 loops, best of 3: 5.48 µs per loop
In [74]: %timeit (x[:, np.newaxis] * y).T
100000 loops, best of 3: 6.68 µs per loop
In [75]: %timeit np.outer(x, y).T
100000 loops, best of 3: 12.2 µs per loop
Run Code Online (Sandbox Code Playgroud)