【问题标题】:numpy how to load list of tuples having integersnumpy如何加载具有整数的元组列表
【发布时间】:2014-05-15 16:09:15
【问题描述】:

我想将类型为元组列表的缓冲区字符串加载到 numpy 数组中。

例如

numpy.fromstring('(1,2),(3,4),', dtype=numpy.int64)

ValueError:字符串大小必须是元素大小的倍数

但是我无法确定应该使用哪个 dtype 参数?

我不想选择numpy.array(eval('(1,2),(3,4),')),因为在某些情况下,元组的长度会更高...

【问题讨论】:

    标签: python arrays numpy buffer eval


    【解决方案1】:

    也许您可以将re.finditernp.fromiter 一起使用:

    import re
    import numpy as np
    
    text = '(1,2),(3,4),'
    arr = np.fromiter((item.group() 
                       for item in 
                       re.finditer(r'\d+', text)),
                      dtype=np.int64).reshape((-1, 2))
    
    print(arr)
    

    产量

    array([[1, 2],
           [3, 4]], dtype=int64)
    

    请注意,如果您可以将文本安排为:

    '1 2\n3 4'
    

    然后它可以更容易(更快)加载到 NumPy 数组中:

    import io
    text = '1 2\n3 4'
    np.genfromtxt(io.BytesIO(text), dtype=np.int64)
    

    产量

    array([[1, 2],
           [3, 4]], dtype=int64)
    

    【讨论】:

      【解决方案2】:

      这对你有用吗?

      import ast
      import numpy as np
      
      mystring = '(1,2),(3,4),(5,6), (7,8,9), (10,11,12,13)'
      numpy.array(ast.literal_eval(mystring))
      

      结果

      array([(1, 2),
             (3, 4),
             (5, 6),
             (7, 8, 9),
             (10, 11, 12, 13)],
           dtype=object)
      

      【讨论】:

        【解决方案3】:

        发生错误是因为 numpy 期望您的字符串代表构成数据的字节。为了让 numpy 将您的数据解释为文本,您需要提供 sep 参数。

        但是,这仍然对您没有帮助。您在这里有多个字符,它们是您的分隔符。我认为您能做的最好的事情就是将ast.literal_eval 字符串转换成一个元组的元组并将其传递给numpy.array。这样做的好处是您可以立即获得一个 2D 数组——我不相信你可以哄 numpy.fromstring 给你一个 2D 数组——你必须以某种方式计算出尺寸并重新调整它。

        最终,如果 evalast.literal_eval 步骤是瓶颈,那么您可能应该开始考虑如何重构代码/输入

        【讨论】:

          猜你喜欢
          • 2012-08-28
          • 2021-12-20
          • 2017-11-09
          • 1970-01-01
          • 2021-05-12
          • 1970-01-01
          • 2023-01-03
          • 2018-05-03
          • 2023-03-26
          相关资源
          最近更新 更多