NumPy将数组相乘得到矩阵(外积)

4

我有两个形状为(5,1)的numpy数组,分别是:

a=[1,2,3,4,5]

b=[2,4,2,3,6]

我该如何制作一个矩阵,将每个第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

不使用for循环?是否有一种结合重塑、减少或乘法的方法可以使用?

目前,我沿着行和列创建了一个a*b的瓷砖数组,然后进行逐元素乘法,但是我觉得应该有更简单的方法。


你想要这两个数组的外积:https://dev59.com/3l4c5IYBdhLWcg3wiKyU - Alex Riley
2个回答

5

通过使用 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]]

谢谢!这个可以用。如果您有任何建议使问题更易理解,请告诉我。我忘记了它被称为向量的外积。 - lesolorzanov
@ZloySmiertniy,欢迎,我会在标题末尾添加*(外积)*并格式化代码。 - RomanPerekhrest

2

出于某些原因,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

听起来很有趣。我正在处理的矩阵非常大,比如有90K乘以100K个元素,所以可能不会有任何变化。 - lesolorzanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接