NumPy矩阵没有正确索引范围[0,0,0,5:53] .shape = 43

时间:2016-09-06 15:21:42

标签: python numpy

我有一个相当大的numpy矩阵,我正在思考,因为它发生了这么大。它必须是某种指针问题。

无论如何,我有以下矩阵

(Pdb) input_4d_volume.shape
(26010, 48, 48, 48)

当我像下面那样索引时,没问题:

(Pdb) input_4d_volume[0,0,0,0:48].shape[0]
48

但是当我尝试做范围时,最大值总是最大值48

例如,请考虑以下两种情况:

(Pdb) input_4d_volume[0,0,0,1:1+48].shape[0]
47
(Pdb) input_4d_volume[0,0,0,10:10+48].shape[0]
38

预期产出应为:

(Pdb) input_4d_volume[0,0,0,1:1+48].shape[0]
48
(Pdb) input_4d_volume[0,0,0,10:10+48].shape[0]
38

(1+48)-1 = 48(10+48)-10 = 48(见下面的示例作为证据)

作为证明这是有效的,我有另一个完美无缺的矩阵

(Pdb) entire_volume.shape
(99, 396, 396)
(Pdb) entire_volume[0,0,0:100].shape[0]
100
(Pdb) entire_volume[0,0,10:10+100].shape[0]
100

这是因为input_4d_volume太大了吗?

2 个答案:

答案 0 :(得分:3)

Python将允许您索引大于对象长度的数字。例如,

import numpy as np
a = np.arange(0, 10)
a[5:100]
# array([5, 6, 7, 8, 9])

如果您的4-D输入阵列具有形状(26010,48,48,48),并且您正在切割第4维,那么您最终得不到大于该维度大小的1D阵列。例如,

a = np.zeros((100,30,30,30))
a[0, 0, 0, 0:5].shape
# (5L,)

a[0, 0, 0, 0:32].shape
# (30L,)

在你证明它有效的例子中,你正在使用entire_volume[0,0,10:10+100].shape[0]对索引10到109的第三维进行切片。这些尺寸在396的尺寸范围内,因此您可以得到您期望的结果。

如果您改为entire_volume[0,0,390:390+100].shape[0],则返回的数组的形状与使用entire_volume[0,0,390:396].shape[0]切片的形状相同。 Python可以让你超越最大值,但它无法返回不存在的数据。

答案 1 :(得分:0)

numpy数组的形状为(26010, 48, 48, 48),因此当您要求input_4d_volume[0,0,0,n:n+48].shape[0] n为正整数时,答案为max(48-n,0)。您看到的行为是正确的,因为python索引从0开始,并接受超出数组末尾的索引。 numpy文档解释了切片的工作原理:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html