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

时间:2014-05-04 20:40:36

标签: python arrays numpy matrix

我有一个2D数组X

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

然后我有一个3D数组,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 个答案:

答案 0 :(得分:2)

问题是这两个数组只有1D且大小不等。这个问题有两种解决方案:

让我们从这开始:

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

方式1-重塑:

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

方式2- np.outer

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

访问numpy数组而不是g[i_class][i]时使用g[i_class,i]。此外,1D阵列的转置不会改变阵列。

最后,如果您按照此处所示运行脚本,则会出现其他错误。 math.exp不会将numpy数组作为输入。为了避免这种情况,您需要使用np.exp或将元素加在一起以返回单个标量。