微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试使用 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 数组上执行操作时遇到困难时有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。