numpy.dot - 确保矩阵兼容性?
我有一个二维数组 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
,或者把元素加起来返回一个单一的数值。