np.array - 要解压的值太多

alb*_*s_c 6 python arrays numpy

我正在编写一个脚本来将图像的一部分(代码中的“子矩阵”,报告如下)保存为 tif 文件。当我运行代码时,出现以下错误:

height, width = np.array(submatrix.shape, dtype = float) / dpi
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

如果我使用像 np.random.random((10, 10)) 这样的随机矩阵代替子矩阵,则一切正常。你发现我做错了什么吗?

使用

import matplotlib.pyplot as plt
import math
import numpy as np
Run Code Online (Sandbox Code Playgroud)

这是错误所在的代码部分:

submatrix = im[x_min:x_max, y_min:y_max]
dpi = size_box
height, width = np.array(submatrix.shape, dtype = float) / dpi
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

错误消息告诉您问题是什么。有太多的价值需要解开。显然submatrix.shape长度大于 2。

我无法说出为什么会这样,因为我不知道是什么im。但请看一下交互式提示的以下输出:

>>> 高度, 宽度 = np.array([1,2], dtype = float)
>>> 高度, 宽度 = np.array([1,2,3], dtype = float)
回溯(最近一次调用最后一次):
  文件“”,第 1 行,位于
ValueError:太多值无法解压

类似的事情会导致你在submatrix履行上述角色时遇到问题[1,2,3]

如果你去掉所有的 numpy,这只是一个标准的序列解包错误。最简单的例子是:

>>> x, y = (1, 2, 3)
回溯(最近一次调用最后一次):
  文件“”,第 1 行,位于
ValueError:太多值无法解压

执行序列解包时,赋值运算符左侧和右侧的序列必须具有相同的长度。

  • 好吧,在其他人这么说之前,有人可能会说最简单的例子可能是“x, = 0, 0”,但这感觉有点太奇怪了。 (2认同)

Mar*_*son 2

每当我遇到这种情况时,我都会将输出设置为单个 var 并检查该 var 以查看里面的内容。

>>> blah = np.array(submatrix.shape, dtype = float) / dpi
>>> dir(blah)
Run Code Online (Sandbox Code Playgroud)

98% 的情况下,我只是错误地计算了数组的大小。(即 X、Y 和 Z)另外 2% 通常是由于可变长度数组(这真的很糟糕)。

早期,我永远不会在声明的同一行上使用序列解包,只是为了使调试更容易。然后我在线上设置了一个断点height, width以查看为什么会导致问题。

blah = np.array(submatrix.shape, dtype = float) / dpi
height, width = blah
Run Code Online (Sandbox Code Playgroud)