numpy中一维数组的乘法

16 投票
2 回答
38609 浏览
提问于 2025-04-18 05:59

我有两个一维向量(在某些情况下它们也可以是二维矩阵)。我找到了用于点积的点函数,但是如果我想用这些形状来计算 a.dot(b):

a = [1,0.2,...]
a.shape = (10,)
b = [2.3,4,...]
b.shape = (21,)
a.dot(b) and I get ValueError: matrices not aligned.

我想要做的是

c = a.dot(b)
c.shape = (10,21)

有没有什么办法可以做到这一点?我也试过转置函数,但它不管用。

2 个回答

1

一种更简单的方法是这样定义你的数组:

 >>>b = numpy.array([[1,2,3]]) 

然后你可以很方便地转置你的数组:

 >>>b.T
 array([[1],
        [2],
        [3]])

你也可以进行乘法运算:

 >>>b@b.T
 [[1 2 3]
 [2 4 6]
 [3 6 9]]

还有一种方法是强制改变你的向量形状,像这样:

>>> b = numpy.array([1,2,3])
>>> b.reshape(1,3).T
array([[1],
       [2],
       [3]])
41

我们先来看两个数组:

>>> a
array([0, 1, 2, 3, 4])
>>> b
array([5, 6, 7])

把这两个数组转置是行不通的,因为它们只有一维,根本没有什么可以转置的。相反,你需要添加一个新的轴:

>>> b.T
array([5, 6, 7])
>>> b[:,None]
array([[5],
       [6],
       [7]])

如果想让点积正常工作,你需要做一些复杂的操作:

>>> np.dot(a[:,None],b[None,:])
array([[ 0,  0,  0],
       [ 5,  6,  7],
       [10, 12, 14],
       [15, 18, 21],
       [20, 24, 28]])

你可以依靠广播功能,而不是使用 dot

a[:,None]*b

或者你也可以简单地使用 outer:

np.outer(a,b)

这三种方法得到的结果都是一样的。

你可能还会对这样的内容感兴趣,这样每个向量总是保持为一个二维数组:

np.dot(np.atleast_2d(a).T, np.atleast_2d(b))

撰写回答