我有一个相当大的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
太大了吗?
答案 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。