【问题标题】:" ValueError: operands could not be broadcast together with shapes (109,109) (2,) (109,109) "“ ValueError: 操作数不能与形状 (109,109) (2,) (109,109) 一起广播”
【发布时间】:2020-09-11 00:19:48
【问题描述】:

我在 jupyter 笔记本中使用 astropy 来处理 fit 文件。我正在使用名为 pyKLIP 的第三方应用程序。

谁能解释这个错误消息的结构,因为它有三组括号(逐字,原文如此)。我发现这个错误消息没有这样的结构,它有三组括号,这使得破译它需要什么变得更加困难。

ValueError: operands could not be broadcast together with shapes (109,109) (2,) (109,109)

109,109 只能是适合图像的分辨率,保存在 91 个 109 行 x 109 列的单独帧的 numpy 数组中。

我还不能确定 2,因为我无法在第三方函数中打印打印语句。我所知道的唯一 2 个是由 91 组 x 中心和 y 中心组成的数组。

进入第三方应用程序的规范要求:

输入 = N 个形状为 (y,x) 的图像的形状 (N,y,x) 数组

centers = N 个输入中心的形状 (N,2) 数组,格式为 [x_cent, y_cent]

如果我将这些成员打印为我得到的大小和形状:

dataset.input.size      :  1081171
dataset.input.shape     :  (91, 109, 109)
dataset.centers.size    :  182
dataset.centers.shape   :  (91, 2)

非常感谢任何破译此广播错误的指针。谢谢。

【问题讨论】:

  • 当您应用一些带有out= 参数的运算符时,可能会出现这种消息,例如a = np.random.rand(109, 109); b = np.random.rand(2); np.add(a, b, out=a)
  • 您能解释一下您要做什么吗?这是数组不匹配时的一般错误消息。例如,使用 (n x k) 和 (m x l) 添加两个不同大小的数组或矩阵乘法,其中 k != m。
  • “我还不能确定,因为我无法在第三方函数中打印打印语句”如果您想尝试自己调试,请搜索如何使用 pdb。这是一项非常宝贵的技能。

标签: python numpy broadcast astropy operands


【解决方案1】:

在寻找此类错误的帮助时,请关注消息的第一部分,broadcast togetherTHREE SETS of parentheses 特定于您的情况。知道broadcasting rules 很明显这三个数组不能一起工作。你的任务是确定哪些。

你发现的事实:

dataset.input.shape     :  (91, 109, 109)
dataset.centers.shape   :  (91, 2)

建议您的代码(或被调用的代码)正在对这些数组的第一个维度进行某种“批量”迭代,与

dataset.input[i]
dataset.centers[i]

但如果没有完整的追溯,我们就不能说更多了。即使有回溯,也很难将即时错误追溯到代码中的源。

【讨论】:

    【解决方案2】:

    我更愿意将推荐给解决方案的个人归功于个人。

    Iguananaut 说要一个调试器。我研究了调试器,确定 Python Visual Debugger 是票,然后发现它需要 Anaconda。安装 Anaconda,然后为 Anaconda 安装 pyklip,然后在 Anaconda 的 pyklip 模块中制作我自己的打印语句,无论出于何种原因,Anaconda 的 pyklip 模块都能够执行我的打印语句。

    所以,我看到系统*希望添加两个单独的 ONE 实例二元素元组,但被 *馈送一个 ONE 实例二元素元组 + 一个 NNN 实例二元素元组数组.这正是失败消息所说的行号。

    我将不得不检查更多,但我认为规范可能不够模糊,以至于得出错误的结论。我*认为“centers = Array of shape (N,2) for N input center in format [x_cent, y_cent]”应该相当于“shape (1,2)”。 (IIRC 元组没有形状成员..)

    谁能谈谈 Anaconda 安装第三方库 pyklip 如何或为什么允许 pyklip 代码中的打印语句成功执行,而 pyklip 的 github 存储库*不允许 pyklip 代码中的打印语句成功执行?

    对第一个问题的实质性回答是,109 行乘 109 列需要使每个单元格值向上或向下移动非常小的量,以实现图像的重新居中。它无法达到这一点,因为无法正确计算 dx 和 dy,即两个单独的 ONE-instance 二元素元组之间的差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多