【问题标题】:using numpy to convert an int to an array of bits使用 numpy 将 int 转换为位数组
【发布时间】:2016-05-12 16:04:48
【问题描述】:

我需要一种方法将 2000 万个 32 位和 64 位整数转换为相应的位数组(因此这必须是内存/时间效率的)。根据 SO 上另一个 question/answer 的建议,我试图通过使用 numpy.unpackbits 来做到这一点。在尝试这种方法时,我遇到了意想不到的结果:

np.unpackbits(np.array([1], dtype=np.uint64).view(np.uint8))

产生:

array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)

我希望1 元素是最后一个,但不是在中间。所以我显然错过了保留字节顺序的东西。我错过了什么?

【问题讨论】:

  • 我没有看到证明这一点的文档,但我假设当我创建一个 int64 类型的数组并用更小的数据填充它时,每个元素都会被转换为 long。 IE。相当于 C 中的强制转换,应该用0s 填充高阶位。
  • 2000万!但我希望不要手工编辑O_o
  • This answer 建议您阅读this link
  • @StevenRumbalski:我不能。 np.unpackbits 需要一个字节数组
  • @Robᵩ:这就是我得到这个想法的问题/答案。我确实查看了该链接,但我认为它不适用于此处,因为我的数据 (1) 是在运行 python 进程的同一台计算机上生成的。我可以再看看其他线索。

标签: python python-3.x numpy


【解决方案1】:

试试:dtype='>i8',像这样:

In [6]: np.unpackbits(np.array([1], dtype='>i8').view(np.uint8))
Out[6]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype=uint8)

参考:

http://docs.scipy.org/doc/numpy/user/basics.byteswapping.html

【讨论】:

  • 噢!好的,我应该已经阅读了前几段。
  • 虽然我仍然不明白为什么我必须这样做,因为数据是在相同的内存架构下生成和消费的。
  • 因为您的 PC 是 little-endian,而您要求使用 big-endian 表示。
  • "你要求大端表示" 我的初始代码没有发出任何字节顺序请求。 view 默认情况下是否假定基础数据的大端字节序?我认为view(np.uint8) 导致只是逐字节读取内存,这意味着那里的数据已经按大端顺序排列(那么是什么将这种顺序强加于小端顺序系统)。
  • 我的意思是在你的问题中,,而不是你的程序,要求一个大端表示。您反对的表示是 little-endian。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2020-10-10
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多