【问题标题】:shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0)形状 (3,1) 和 (3,) 未对齐:1 (dim 1) != 3 (dim 0)
【发布时间】:2021-10-12 13:11:42
【问题描述】:

这里是定义的函数,因此它必须是一个标量,但是当调用该函数时出现此错误:形状 (3,1) 和 (3,) 未对齐:1 (dim 1) != 3 (暗淡 0)

def Angle_sun(panel):
  print(panel)
  sun = np.array([[0], [-1368], [0]])
  dott = np.dot(panel, sun)
  return math.acos(dott/(np.linalg.norm(panel)) * np.linalg.norm(sun))

其中面板 = [[0. ],[0.92], [0.39]]

面板是 (3,1)

【问题讨论】:

  • 请看How to ask?。您需要将代码和数据添加为文本,因为我们无法从图像中复制内容。
  • 您是否重新阅读了np.dot 文档?了解它如何处理维度,包括一个数组是 1d 的情况?你了解dot 的参数形式吗?
  • dott 应该是什么? (3,3) 还是标量? (3,1) 与 (1,3) 的矩阵乘积,或者 (3,) 与 (3,) 的向量点?

标签: python arrays numpy matrix


【解决方案1】:

请查看matrix dot product (Wikipedia),对于a.b,所需矩阵的大小应分别为NxMMxN。如果您查看numpy.dot documentation,您就会知道传递给它的不同形状的矩阵会生成什么输出。

numpy.dot(a, b, out=None)
两个数组的点积。具体来说, 如果 a 和 b 都是一维数组,则它是向量的内积 (没有复杂的共轭)。

如果 a 和 b 都是二维数组,则为矩阵乘法,但使用 matmul 或 a @ b 是首选。

如果 a 或 b 是 0-D(标量),则相当于乘以和 最好使用 numpy.multiply(a, b) 或 a * b。

如果 a 是 N 维数组,b 是 1 维数组,则它是一个和积 a 和 b 的最后一个轴。

如果 a 是 N-D 数组, b 是 M-D 数组(其中 M>=2),则它是和 在 a 的最后一个轴和 b 的倒数第二个轴上的乘积

由于上面的sun矩阵的维度是3x1,而你正在执行panel.sunpanel矩阵的维度应该是1x3,然后是两个形状为1x3的矩阵的点积,而3x1 将是1x1

因此,您拥有的面板列表应该是一维列表,即[0.0, 0.92, 0.39],而不是[[0.0], [0.92], [0.39]],这当然是一个二维列表。

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2015-04-28
    • 2018-10-05
    • 2019-03-21
    • 2019-05-28
    • 2021-04-25
    相关资源
    最近更新 更多