为什么torch.from_numpy需要不同的字节顺序,而matplotlib却不需要?

时间:2019-12-09 10:57:00

标签: python matplotlib pytorch astropy

这是一段代码(在Linux CentOS 7.7.1908,x86_64上运行)

import torch    #v1.3.0
import numpy as np  #v1.14.3
import matplotlib.pyplot as plt
from astropy.io.fits import getdata   #v3.0.2
data, hdr = getdata("afile.fits", 0, header=True) #gives dtype=float32 2d array
plt.imshow(data)
plt.show()

这给出了一个很好的512x512图像 enter image description here

现在,我想将“数据”转换为PyTorch张量:

a = torch.from_numpy(data)

尽管,PyTorch会提高:

  

ValueError:给定的numpy数组的字节顺序与本机字节顺序不同   字节顺序。当前不支持字节顺序之间的转换。

好吧,我尝试了不同的操作,但都没有成功:即。 byteswap(),copy()

一个主意?

PS:当我仍然可以通过matplotlib传输数据到Mac OSX(Mojave)时,会发生相同的错误。

2 个答案:

答案 0 :(得分:1)

FITS以大端字节顺序存储数据(在开发FITS时,这是一种更为通用的机器体系结构;可悲的是,该标准从未进行过更新,以允许在此方面具有灵活性,尽管可以使用单个标头轻松完成指示数据的字节序的关键字...)

根据Numpy docs的Numpy数组将基础数据的字节序作为其 dtype 的一部分进行报告(例如dtype的'> i'表示big-endian int,而'and更改数组的dtype以反映新的字节顺序。

您的调用.astype(np.float32)的解决方案应该可以工作,但这是因为np.float32 dtype显式为小端,因此.astype(...)复制现有数组并在该数组中转换数据(如果必要,以匹配该dtype。我只是想确切解释为什么会这样做,因为不清楚为什么会这样做。

至于matplotlib,它与您的问题并没有多大关系。通过根据需要自动执行字节交换,Numpy数组可以透明地对与您的计算机体系结构的字节序不匹配的数据执行操作。 Matplotlib和许多其他科学的Python库直接与Numpy数组一起使用,因此自动受益于其对字节序的透明处理。

PyTorch碰巧发生了(部分原因是因为其非常高性能和以GPU为中心的数据处理模型)需要您将已处理过的数据按小端顺序进行处理,也许只是为了避免模棱两可。但这是PyTorch特有的,与matplotlib没有特别的区别。

答案 1 :(得分:0)

好吧,从FITS读取数据数组后,我找到了解决方法

data = data.astype(np.float32)
a = torch.from_numpy(data)

没有错误,一切都很好...