【问题标题】:Numpy arrax of integers from decimal to binary in pythonpython中从十进制到二进制的整数的numpy数组
【发布时间】:2021-10-13 01:56:06
【问题描述】:

我有一个 numpy 数组:ch=[1, 2, 3, 4, 20, 25]

我怎么写:b'\x01\x02\x03\x04\x14\x19'

注意:我不想将每个整数转换为二进制。有什么功能可以直接一步完成吗?

【问题讨论】:

  • ch 是一个 numpy 数组
  • import numpy as geek ch=geek.array([1, 2, 3, 4, 20, 25]) x=bytes(ch) print(x)

标签: python python-3.x numpy numpy-ndarray


【解决方案1】:

以下将起作用:

b"".join([int(item).to_bytes(1, "big") for item in ch])

首先遍历 NumPy 数组,将每个 np.int32 对象转换为 int,在其上调用 int.to_bytes(),以大端顺序返回 1 个字节(您也可以在此处使用 "little"),然后加入他们都在一起。

或者,您可以在数组上调用 list(),然后将其传递给内置的 bytes() 构造函数:

bytes(list(ch))

【讨论】:

    【解决方案2】:

    您可以使用bytes bult-in 并传递序列:

    >>> ch=[1, 2, 3, 4, 20, 25]
    >>> bytes(ch)
    b'\x01\x02\x03\x04\x14\x19'
    

    顺便说一句,您展示的是一个 python 列表,而不是一个 numpy 数组。

    但是,如果要对numpy数组进行操作,可以先将其转换为python列表:

    >>> bytes(np.array(ch).tolist())
    b'\x01\x02\x03\x04\x14\x19'
    

    当您直接在numpy数组上尝试to_bytes()获取上述数据时:

    >>> np.array(ch).tobytes()
    b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x14\x00\x00\x00\x19\x00\x00\x00'
    

    上面的输出也是对的,只是数据类型的不同,打印出来就知道是numpy.int32,也就是32位表示32/8=4字节,也就是个数表示每个值所需的字节数。

    >>> np.array(ch).dtype
    dtype('int32')
    

    如果将其转换为 8 位即 1 字节数,则输出将与在列表上使用 bytes bultin 相同:

    >>> np.array(ch).astype(np.int8).tobytes()
    b'\x01\x02\x03\x04\x14\x19'
    

    【讨论】:

    • 这对我不起作用。我得到b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x14\x00\x00\x00\x19\x00\x00\x00'
    • 在 Python 3.7.5 win10 上运行良好
    • 您正在对列表进行操作。 OP 特别指出了一个 NumPy 数组。
    • @MattDMo,但输入的不是 numpy 数组。
    • 我们如何改变小端或大端?
    猜你喜欢
    • 2018-12-30
    • 2012-10-08
    • 2017-08-22
    • 2021-05-18
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2020-10-26
    • 2018-06-27
    相关资源
    最近更新 更多