如何使用python对数据立方体求和

2024-10-06 11:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python折叠fits数据立方体。我知道有专门的软件包在做这件事,但这只是为了演讲。我首先在Z中提取一个子多维数据集: hdu.data = hdu.data[3365:3405, :, :]subcube = hdu.data 子立方体的尺寸为Z=40、Y=50和X=26。我想在X和Y方向上通过一个双循环以一种全方位的方式折叠立方体,以便得到一个简单的2D图像

for i in range(1, xdim):
    for j in range(1, ydim):    
        Sum[j,i] = subcube[:,j,i].sum()

我收到一条错误消息:IndexError:Index26超出了大小为26的轴1的界限。 我知道python以不同的方式处理多维数据集维度,例如Z、Y、X,而不是像IDL那样处理X、Y、Z,但我不明白为什么会出现错误


Tags: 数据in图像fordata尺寸错误方式
3条回答

Python范围以0开头。X的范围为0-25。对于Y和Z是相同的。 也许简单的双循环子立方体和新的列表创建可以帮助你? z_flatten = [[sum(col) for col in row] for row in subcube]

Python索引从0开始。您需要在for循环中执行range(xdim)range(ydim)

现有的答案指出Python是0索引的,这是正确的,但是还没有人指出您甚至不需要使用np.zeros或使用任何for循环来创建空数组

Numpy已经允许您沿阵列的特定应用大多数操作,而不是在子立方体的维度上循环,一次只求和一个像素

例如,让我们制作一个3x4x4数据立方体:

>>> cube = np.arange(3 * 4 * 4).reshape((3, 4, 4))
>>> cube
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23],
        [24, 25, 26, 27],
        [28, 29, 30, 31]],

       [[32, 33, 34, 35],
        [36, 37, 38, 39],
        [40, 41, 42, 43],
        [44, 45, 46, 47]]])

假设您要将此立方体的3x3切片的所有层相加:

>>> cube[:, :3, :3].sum(axis=0)
array([[48, 51, 54],
       [60, 63, 66],
       [72, 75, 78]])

在你的情况下,等价物是

subcube[:, :ydim, :xdim].sum(axis=0)

这相当于您正在尝试的操作,但效率要高得多

一般来说,尽管您从FITS文件中读取数据立方体,但由于astropy.io.fits返回一个Numpy数组,因此您可以找到的关于Numpy数组的任何文档或问题通常都适用于它,因为它来自FITS文件在这一点上并不重要。我指出这一点,只是因为如果您正在努力在Numpy阵列上执行操作,它可能会在将来对您有所帮助

相关问题 更多 >