我有一个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
。但我认为我必须遗漏一些东西。
这样做的正确方法是什么?
答案 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
或将元素加在一起以返回单个标量。