如何有效地将 Numpy 向量乘以数字数组?

How do you Efficiently Multiply a Numpy Vector by an Array of Numbers?

如果我有一组值:

numbers = np.array([1, 2, 4, 5])

和一个向量:

vector = np.array([1, 0, 1])

如何将向量乘以值数组得到以下结果:

vector_array = np.array([[1, 0, 1], [2, 0, 2], [4, 0, 4], [5, 0, 5]])

我尝试通过执行以下操作使用 matmul 来执行此操作:

vector_array = vector[..., None]@numbers

和:

vector_array = vector.T@numbers

我希望得到可以转置的列向量,但是我得到的是这个输出:

选项 1:

vector_array = vector[..., None]@numbers
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)

选项 2:

vector_array = vector.T@numbers
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)

如何强制 matmul 以预期的方式运行并将列向量乘以行向量得到一个矩阵?我应该使用其他功能吗?

使用numpy broadcasting:

vector_array = vector * numbers[:, None]

输出:

>>> vector_array
array([[1, 0, 1],
       [2, 0, 2],
       [4, 0, 4],
       [5, 0, 5]])

要理解它,请看numbers[:, None]:

>>> numbers
array([1, 2, 4, 5])

>>> numbers[:, None]
array([[1],
       [2],
       [4],
       [5]])

所以基本上 vector * numbers[:, None]vector 乘以 numbers 的每个元素。

一种与@richardec 给出的不同的可能性是使用 numpy.outer:

numpy.outer(numbers, normal) = np.array([[1, 0, 1], [2, 0, 2], [4, 0, 4], [5, 0, 5]])

根据需要。但是,我不确定哪种方法更快。