Python 为什么numpy.shape()有时无法识别更高的维度?

Python 为什么numpy.shape()有时无法识别更高的维度?,python,numpy,shape,Python,Numpy,Shape,我意识到有人问过这个问题,但它们不是完全相同的问题,也没有任何令人满意的答案 假设我有一个浮动列表列表。(本例中为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.7223736

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

假设我有一个浮动列表列表。(本例中为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]
这是一个错误
无法将输入数组从形状(2,4,3,7)广播到形状(2)

三件事:

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

我猜你有(2,4)
numpy数组
,它保存的对象可以被认为是
2D
,但是
numpy
完全不知道它。

你的输入可能不是2x4x3x7。你可能在某个地方有一个额外的元素或缺少的元素。再发布一次,你会再次被否决,然后重复关闭。无论你认为你真正的输入有什么样的网格结构,它可能实际上并没有那个结构。当然,您还没有发布一个,因此我们无法实际调试您的问题,因此出现了下一票。您可能正在其他数组中嵌套数组对象,而43155977的问题可能与此完全相同。查看Dawid的诊断,再看看
m.dtype
,如果它显示
对象
,那就更证明它是一个复制品。如果它是
float
int
,这是有用的信息。@johnktejik问题是,正如其他人所指出的,你的错误在于认为你拥有的任何列表都是正确的,无论你认为它是什么形状。注意,
numpy.ndarray
对象是真正的多维数组,也就是说,它们不是“交错”数组,每个元素都必须符合形状。所以如果你做了
np.array([[1,2],[3,4,5]])
,它将返回一个包含两个元素的一维数组,即
shape==(2,)
你可能认为它应该是(2,2)或(2,3)。dtype=对象将是一个巨大的赠品。因此,除非您提供一个,否则这是唯一合理的猜测。这是一个常见的错误,以前曾经咬过numpy用户,我更愿意打赌您对列表对象的性质是错误的,而不是
numpy
是错误的。感谢您提供了一些建设性的东西。你能解释一下为什么numpy可能不“知道”这些物体吗?@johnktejik基本上,numpy并不假装聪明。它知道如何处理列表、元组和其他numpy.ndarray,但在其他情况下,它只会尝试创建一个传递给它的对象数组。将其转换为已知格式是您的责任。以numpy/core/records.py:“def array”为例。