【问题标题】:Why does numpy.shape() sometimes not recognize higher dimensions? [closed]为什么 numpy.shape() 有时无法识别更高的维度? [关闭]
【发布时间】:2017-11-27 22:48:13
【问题描述】:

我知道herehere 有人问过这个问题,但它们不是完全相同的问题,也没有任何令人满意的答案。

假设我有一个浮动列表列表列表。 (本例中为 2x4x3x7)

但是np.shape 没有返回正确的结果。 这是演示问题的代码:

 m= np.array(m)
 print "shape:",m.shape
 # print "2:",m.shape[2] #error: tuple index out of bounds
 print m[0][0][0]

输出是:

shape: (2L, 4L)
[  1.72237368e+06   2.89463050e+06   4.95241789e+06   7.93088857e+07   1.32649567e+08   2.25869653e+08   3.91489578e+08]

关键是,np.shape() 给出了错误的结果,说当有 4 个维度时只有 2 个维度。

有人知道为什么吗?

详情:

m 只是更大数组中的一行。我正在处理图像,对于每一帧,我创建了不同的统计数据集,每一个都存储在这个形状数组中。

所以这个2x4x3x7 数组只是一帧,千分之一。其他 999 个没有有这个问题。他们的shape() 工作正常。我可以看到这个框架没有什么特别之处。

最终目标是根据某些参数提取横截面,并将其与其他图像进行比较。 例如:

m = np.array(m)
ms2 = m[:,1,:,5]

这给出了一个错误 could not broadcast input array from shape(2,4,3,7) into shape (2)

【问题讨论】:

  • 您的输入可能不是 2x4x3x7。您可能在某处获得了额外的元素或缺少的元素。
  • 再次发布此内容,您将再次被否决,并被关闭。无论您认为您的真实输入具有何种网格结构,它可能实际上都没有这种结构。当然,您还没有发布minimal reproducible example,所以我们实际上无法调试您的问题,因此投了反对票。
  • 您可能将数组 objects 嵌套在其他数组中,而 43155977 的问题可能是完全相同的问题。请参阅 Dawid 的诊断,再加上查看 m.dtype,如果它显示 object,那就更能证明它是骗子。如果是floatint,这是有用的信息。
  • @johnktejik point 是,正如其他人所指出的那样,您的错误在于认为您拥有的任何列表列表都是正确的您认为的任何形状.注意,numpy.ndarray 对象是真正的多维数组,也就是说,它们不是“交错”数组,每个元素都必须符合形状。因此,如果您执行np.array([[1,2], [3,4,5]]),它将返回一个包含两个元素的一维数组,即shape == (2,),而您可能认为它应该是(2,2) 或( 2,3)。 dtype=object 将是一个很大的赠品。
  • 所以除非你提供minimal reproducible example,否则这是唯一合理的猜测。这是一个常见的错误,以前曾困扰过 numpy 用户,我更愿意打赌 you 对列表对象的性质有误,而不是 numpy 是错误的。

标签: python numpy shape


【解决方案1】:

三件事:

print(type(m))
print(type(m[0,0]) 
print(m[0,0,0])

我的猜测是你有 (2,4) 个numpy array 包含可以被视为2D 的对象,但numpy 理所当然地不知道它。

【讨论】:

  • 感谢您提供建设性的东西。您能否详细说明为什么 numpy 可能不“知道”所述对象?
  • @johnktejik 基本上,numpy 不会假装很聪明。它知道在列表、元组和其他 numpy.ndarray 的情况下要做什么,但在其他情况下,它只会尝试创建一个传递给它的对象数组。您有责任将其转换为已知格式。以一个numpy/core/records.py:"def array"为例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多