显示 ValueError: 形状 (1,3) 和 (1,3) 不对齐:3 (维度 1) != 1 (维度 0)

34

我正在尝试使用以下矩阵并执行如代码所示的点积。 我检查了所有矩阵的大小都为(3,1),但在最后两个点积时出现错误。

coordinate1 = [-7.173, -2.314, 2.811] 
coordinate2 = [-5.204, -3.598, 3.323] 
coordinate3 = [-3.922, -3.881, 4.044] 
coordinate4 = [-2.734, -3.794, 3.085] 

import numpy as np 
from numpy import matrix
coordinate1i=matrix(coordinate1)
coordinate2i=matrix(coordinate2)
coordinate3i=matrix(coordinate3)
coordinate4i=matrix(coordinate4)

b0 = coordinate1i - coordinate2i
b1 = coordinate3i - coordinate2i
b2 = coordinate4i - coordinate3i

n1 = np.cross(b0, b1)
n2 = np.cross(b2, b1)

n12cross = np.cross(n1,n2)
x1= np.cross(n1,b1)/np.linalg.norm(b1)
print np.shape(x1)
print np.shape(n2)
np.asarray(x1)
np.asarray(n2)

y = np.dot(x1,n2)
x = np.dot(n1,n2)

return np.degrees(np.arctan2(y, x))
6个回答

33

通过使用将矩阵转换为数组

n12 = np.squeeze(np.asarray(n2))

X12 = np.squeeze(np.asarray(x1))

问题已解决。


11
傻问题-你的解决方案在原来的代码中适用于哪里? - Evgeny

8
第一个矩阵的列数和第二个矩阵的行数应该相等,只能按照这种顺序。
column of first matrix = row of second matrix

并且不要按照以下步骤进行操作

row of first matrix  = column of second matrix

这将会抛出一个错误。


5
与标准算术不同,点积需要满足以下维度之一:
  • (X..., A, B) dot (Y..., B, C) -> (X..., Y..., A, C),其中...表示“0个或多个不同的值”
  • (B,) dot (B, C) -> (C,)
  • (A, B) dot (B,) -> (A,)
  • (B,) dot (B,) -> ()
你的问题在于你正在使用np.matrix,这在你的代码中完全是不必要的。 np.matrix的主要目的是将a * b翻译成np.dot(a,b)。通常情况下,np.matrix可能不是一个好选择。

5
numpy.dot(a, b, out=None)

两个数组的点积。

对于N维,它是a的最后一个轴和b的倒数第二个轴的乘积之和。

文档:numpy.dot


1
这个错误也可能在使用statsmodels时出现。内生变量是statsmodels.api.OLS中的第一个位置参数,所以如果顺序搞错了就会显示这个错误。例如,
import statsmodels.api as sm

x = [[1,2,3]]*100
y = [1,2]*50
model = sm.OLS(x, y).fit()     # <---- ValueError
model.summary()

# ValueError: shapes (100,3) and (100,3) not aligned: 3 (dim 1) != 100 (dim 0)

传递参数的正确顺序解决了错误。
model = sm.OLS(y, x).fit()     # <---- OK
#              ^^^^       <---- change the order of `y` and `x`
model.summary()

1
解决方案:将n2的转置输入到点积中: np.dot(x1, n2.T)
要使点积有效,输入矩阵的维度必须满足一定条件:第一个矩阵的列数等于第二个矩阵的行数。
你有两个维度为(1,3)的矩阵: x1.shape => (1,3), n2.shape => (1,3)。 根据上述规则,你需要 x1.shape => (1,3), n2.shape => (3,1)。 通过对n2进行转置就可以轻松实现这一点,如上所示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接