numpy.dot - 确保矩阵兼容性?

2 投票
1 回答
754 浏览
提问于 2025-04-18 05:21

我有一个二维数组 X

X[i] 是一个一维数组,里面有3个值。它的形状是: (3L,)

然后我有一个三维数组 g,它的大小是 2x3x2。如果我打印出 g[j] 的形状,它是: (3L,2L),而 g[j][i] 的形状是 (2L,)

现在我在运行一个循环,代码大概是这样的:

for j in range(len(g)):
            for i in range(no_samples):
            e = math.exp(1. + np.dot(X[i], g[j][i]) - np.dot(X[i],g[i_class][i]))

但是我遇到了以下错误:

  e = math.exp(1. + np.dot(X[i], g[j][i]) - np.dot(X[i],g[i_class][i]))
ValueError: matrices are not aligned

我想我明白问题出在哪里,但不知道怎么解决。我试着对 g[j][i] 进行转置,但没有任何变化。我还试着把 X[i] 的形状改成 (3L,1L)。我以为如果 X[i] 是 3x1 而 g[j][i] 是 1x2,那么这两个矩阵应该是可以相容的,我应该能用 np.dot。但我觉得我可能漏掉了什么。

正确的做法是什么呢?

1 个回答

2

问题在于这两个数组都是一维的,而且大小不一样。解决这个问题有两种方法:

我们先来看这个:

>>> x
array([3, 4, 5])
>>> x.shape
(3,)             #Same shape as your array, but note that it is only 1D
>>> g
array([2, 3])

方法一 - 重新调整形状:

>>> np.dot(x.reshape(3,1), g.reshape(1,2))
array([[ 6,  9],
       [ 8, 12],
       [10, 15]])

方法二 - np.outer

>>> np.outer(x,g)
array([[ 6,  9],
       [ 8, 12],
       [10, 15]])

在访问numpy数组时,不要用 g[i_class][i],而是用 g[i_class,i]。另外,一维数组的转置不会改变数组本身。

最后,如果你按照这个方式运行你的脚本,你会遇到一个额外的错误。math.exp 不接受numpy数组作为输入。要解决这个问题,你可以使用 np.exp,或者把元素加起来返回一个单一的数值。

撰写回答