【问题标题】:How do I create a numpy array from string?如何从字符串创建一个 numpy 数组?
【发布时间】:2010-11-03 19:42:46
【问题描述】:

我有一个文件阅读器,它从文件中读取 n 个字节并返回代表该(二进制)数据的字符字符串。我想将 n 个字节读入一个 numpy 数字数组并在其上运行 FFT,但我无法从字符串创建数组。几行例子会很棒。

编辑: 我正在读取原始二进制数据,所以我得到的字符串看起来像'\x01\x05\x03\xff'...。我希望它变成[1, 5, 3, 255]

【问题讨论】:

  • 您正在使用的数据结构示例?

标签: python arrays numpy fft


【解决方案1】:

在 Python 2 中,您可以直接使用 numpy.fromstring 执行此操作:

import numpy as np
s = '\x01\x05\x03\xff'
a = np.fromstring(s, dtype='uint8')

完成此操作后,a 即为 array([ 1, 5, 3, 255]),您可以使用常规的 scipy/numpy FFT 例程。

在 Python 3 中,切换到默认 Unicode 字符串意味着您可以将数据作为字节字符串读取,并改用 frombuffer 命令:

import numpy as np
s = b'\x01\x05\x03\xff'
a = np.frombuffer(s, dtype='uint8')

获得相同的结果。

【讨论】:

  • 有没有办法让它一次读取两个字节而不是一个?
  • 这很好——我不知道 numpy 中的那个方法。我只是试了一下,然后又得到了array([ 1, 5, 3, -1], dtype=int8)。知道是什么原因造成的吗?
  • 要一次读取两个字节而不是一个字节,您可以将 dtype 参数更改为 int16uint16 之类的其他值 - 但是,一旦您进入多字节字符串,您可以必须对输出进行字节交换才能正确获得字节顺序。只需将a = np.fromstring(...) 替换为a = np.fromstring(...).byteswap()
  • 我现在使用此方法收到弃用警告:DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  • @Bill 感谢您指出这一点。我已经用字节串和frombuffer 更新了 Python3 安全版本的答案。
【解决方案2】:
>>> '\x01\x05\x03\xff'
'\x01\x05\x03\xff'
>>> map(ord, '\x01\x05\x03\xff')
[1, 5, 3, 255]
>>> numpy.array(map(ord, '\x01\x05\x03\xff'))
array([  1,   5,   3, 255])

【讨论】:

    【解决方案3】:

    在不知道你得到什么的情况下很难,但如果它是逗号分隔的整数,你可以这样做:

    myInts = map(int, myString.split(','))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多