【问题标题】:Why does torch.from_numpy require a different byte ordering while matplotlib doesn't?为什么 torch.from_numpy 需要不同的字节顺序,而 matplotlib 不需要?
【发布时间】:2019-12-10 17:23:12
【问题描述】:

这是一段代码(在 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 仍然可以。

【问题讨论】:

    标签: python matplotlib pytorch astropy


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 太棒了!谢谢@lguananaut,这是一个非常好的解释。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 1970-01-01
      • 2018-07-30
      • 2011-06-18
      • 2021-04-13
      • 1970-01-01
      • 2016-01-10
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多