gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:55:12 27 4
gpt4 key购买 nike

下面是一段代码(运行在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: given numpy array has byte order different from the native byte order. Conversion between byte orders is currently not supported.

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

一个想法?

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

最佳答案

FITS 以 big-endian 字节顺序存储数据(在开发 FITS 时,这是一种更常见的机器架构;遗憾的是,该标准从未更新过以允许在这方面具有灵 active ,尽管它可以通过单个 header 轻松完成关键字来指示数据的字节序......)

根据Numpy docs Numpy 数组将底层数据的字节顺序报告为其 dtype 的一部分(例如,'>i' 的 dtype 表示 big-endian int,并且更改数组的 dtype 以反射(reflect)新的字节顺序。

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

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

恰好 PyTorch(部分原因是其非常高性能和以 GPU 为中心的数据处理模型)要求您将已经按小端顺序排列的数据交给它,也许只是为了避免歧义。但这是 PyTorch 特有的,并不是与 matplotlib 的具体对比。

关于python - 为什么 torch.from_numpy 需要不同的字节顺序而 matplotlib 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59247385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com