问题描述
我正在尝试使用 Python 折叠适合的数据立方体。我知道特殊包装正在这样做,但它是为了讲座目的。我首先在 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: index 26 is out of bounds for axis 1 with size 26. 我知道 python 处理立方体维度的方式不同,例如 Z、Y、X 而不是 X、Y、Z,例如 IDL,但我不知道为什么会出现错误。
解决方法
Python 范围从 0 开始。X 的范围是 0-25。对于 Y 和 Z 相同。
也许通过创建新列表对 subcube 进行简单的双循环可以帮助您?
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 数组上执行操作时遇到困难时有所帮助。