【问题标题】:Convert string to numpy array将字符串转换为numpy数组
【发布时间】:2015-03-28 06:24:57
【问题描述】:

输入:

mystr = "100110"

所需的输出 numpy 数组:

mynumpy == np.array([1, 0, 0, 1, 1, 0])

我试过了:

np.fromstring(mystr, dtype=int, sep='')

但问题是我无法将字符串拆分为每个数字,因此 numpy 将其视为一个数字。知道如何将我的字符串转换为 numpy 数组吗?

【问题讨论】:

    标签: python arrays string numpy


    【解决方案1】:

    除了上述答案之外,当您使用 fromstring
    DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead 时,numpy 现在会给出弃用警告。
    更好的选择是使用fromiter。它的执行速度是原来的两倍。这就是我在 jupyter notebook 中得到的 -

    import numpy as np
    mystr = "100110"
    
    np.fromiter(mystr, dtype=int)
    >> array([1, 0, 0, 1, 1, 0])
    
    # Time comparison
    %timeit np.array(list(mystr), dtype=int)
    >> 3.5 µs ± 627 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit np.fromstring(mystr, np.int8) - 48
    >> 3.52 µs ± 508 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit np.fromiter(mystr, dtype=int)
    1.75 µs ± 133 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    【讨论】:

      【解决方案2】:

      list 可以帮助您做到这一点。

      import numpy as np
      
      mystr = "100110"
      print np.array(list(mystr))
      # ['1' '0' '0' '1' '1' '0']
      

      如果你想获取数字而不是字符串:

      print np.array(list(mystr), dtype=int)
      # [1 0 0 1 1 0]
      

      【讨论】:

      • 需要注意的是,对于较大的输入,grc 的第一个使用np.fromstring('...', np.int8) 的方法要快得多。从(大)字符串创建list 是不必要的。
      【解决方案3】:

      您可以将它们读取为 ASCII 字符,然后减去 48(0 的 ASCII 值)。对于大字符串,这应该是最快的方法。

      >>> np.fromstring("100110", np.int8) - 48
      array([1, 0, 0, 1, 1, 0], dtype=int8)
      

      或者,您可以先将字符串转换为整数列表:

      >>> np.array(map(int, "100110"))
      array([1, 0, 0, 1, 1, 0])
      

      编辑:我做了一些快速的计时,第一种方法比先将其转换为列表快 100 倍以上。

      【讨论】:

      • 我强烈建议使用ord('0') 而不是48。显式优于隐式。
      猜你喜欢
      • 2013-05-05
      • 2016-03-10
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多