Python 为什么torch.from numpy需要不同的字节顺序,而matplotlib不需要';T

Python 为什么torch.from numpy需要不同的字节顺序,而matplotlib不需要';T,python,matplotlib,pytorch,astropy,Python,Matplotlib,Pytorch,Astropy,下面是一段代码(在Linux CentOS 7.7.1908、x86_64上运行) 这提供了一个很好的512x512图像 现在,我想把“数据”转换成PyTorch张量: a = torch.from_numpy(data) 尽管如此,PyTorch提出: ValueError:给定的numpy数组的字节顺序与本机数组不同 字节顺序。当前不支持字节顺序之间的转换 嗯,我尝试过不同的操作,但没有成功:即byteswap(),copy() 一个主意 PS:当我将数据传输到Mac OSX(Mojav

下面是一段代码(在Linux CentOS 7.7.1908、x86_64上运行)

这提供了一个很好的512x512图像

现在,我想把“数据”转换成PyTorch张量:

a = torch.from_numpy(data)
尽管如此,PyTorch提出:

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

嗯,我尝试过不同的操作,但没有成功:即byteswap(),copy()

一个主意


PS:当我将数据传输到Mac OSX(Mojave)时,同样的错误也会发生,而matplotlib仍然正常。

在从FITS读取数据数组后,我找到了一个解决方法

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

没有抛出错误,一切正常…

FITS以大端字节顺序存储数据(在FITS开发时,这是一种更常见的机器体系结构;遗憾的是,该标准从未更新以允许在这方面具有灵活性,尽管可以很容易地使用单个标题关键字来指示数据的端性…)

根据Numpy,数组将底层数据的尾端性作为其数据类型的一部分进行报告(例如,'>i'的数据类型表示大尾端整数,和',并更改数组的数据类型以反映新的字节顺序

调用
.astype(np.float32)
的解决方案应该是可行的,但这是因为
np.float32
dtype显式是小尾端,所以
.astype(…)
复制现有数组,并在必要时转换该数组中的数据以匹配该数据类型。我只是想确切地解释一下为什么这样做,因为可能不清楚您这样做的原因

至于matplotlib,这与您的问题没有太大关系。Numpy数组可以透明地对与您的机器体系结构的端序不匹配的数据执行操作,方法是根据需要自动执行字节交换。matplotlib和许多其他科学Python库直接与Numpy数组一起工作,因此autOMATALY得益于其对endianness的透明处理


碰巧Pytork(部分原因是它的高性能和以GPU为中心的数据处理模型)可能只是为了避免模棱两可,需要您以小尾端顺序将数据交给它。但这是PyTorch特有的,并不是专门与matplotlib形成对比。

太好了!谢谢@lguananaut这是一个非常好的解释。
data = data.astype(np.float32)
a = torch.from_numpy(data)