首页 > 解决方案 > 为什么 torch.from_numpy 需要不同的字节顺序,而 matplotlib 不需要?

问题描述

这是一段代码(在 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 图像 在此处输入图像描述

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

a = torch.from_numpy(data)

虽然,PyTorch 提出了:

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

好吧,我尝试了不同的操作但没有成功:即。字节交换(),复制()

一个主意?

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

标签: pythonmatplotlibpytorchastropy

解决方案


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

根据Numpy 文档, Numpy 数组将底层数据的字节顺序报告为其dtype的一部分(例如 '>i' 的 dtype 表示大端整数,并更改数组的 dtype 以反映新的字节顺序。

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

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

碰巧 PyTorch(部分原因在于其非常高性能和以 GPU 为中心的数据处理模型)要求您将已经按 little-endian 顺序处理的数据交给它,也许只是为了避免歧义。但这是 PyTorch 特有的,与 matplotlib 并没有特别的对比。


推荐阅读