【问题标题】:What is the proper way of using Python record arrays使用 Python 记录数组的正确方法是什么
【发布时间】:2011-05-19 07:45:33
【问题描述】:

我想将几个列表或数组组合成一个记录数组。 在下面的代码中,我想创建一个包含两个列的记录数组:“a”和“b”。第一列将包含从“a”到“j”的字母,第二列将包含从 0 到 9 的数字

In [22]: a = list('abcdefghij'); b = range(10); c = numpy.vstack((a, b)).T

In [23]: desc = {'names': ('a', 'b'), 'formats': ('S4', 'f4')}

In [24]: d = numpy.array(c, dtype=desc)

In [25]: d
Out[25]: 
array([[('a', 0.0), ('0', 0.0)],
       [('b', 0.0), ('1', 0.0)],
       [('c', 0.0), ('2', 0.0)],
       [('d', 0.0), ('3', 0.0)],
       [('e', 0.0), ('4', 0.0)],
       [('f', 0.0), ('5', 0.0)],
       [('g', 0.0), ('6', 0.0)],
       [('h', 0.0), ('7', 0.0)],
       [('i', 0.0), ('8', 0.0)],
       [('j', 0.0), ('9', 0.0)]], 
      dtype=[('a', '|S4'), ('b', '<f4')])

In [26]: d['a']
Out[26]: 
array([['a', '0'],
       ['b', '1'],
       ['c', '2'],
       ['d', '3'],
       ['e', '4'],
       ['f', '5'],
       ['g', '6'],
       ['h', '7'],
       ['i', '8'],
       ['j', '9']], 
      dtype='|S4')

In [27]: d['b']
Out[27]: 
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]], dtype=float32)

结果完全不是我所期望的。我想要的是:

In [XX]: d['a']
Out[XX]: array(['a', 'b', 'c', ..., 'j'])
In [XX]: d['b']
Out[XX]: array([1., 2., 3., ..., 9.])

编辑

我的目标是能够从现有的numpy.array 创建记录数组,而不仅仅是从单个列表。按照 Sven Marnach 的回答,我有几次尝试和错误,这就是我得到的:

d = array(map(lambda l: tuple(l[0]), zip(c)), dtype=desc)

这似乎是一个非常丑陋的解决方案。谁有更好的?

【问题讨论】:

    标签: python numpy record


    【解决方案1】:

    有不同的方法可以实现您的结果。一个简单的选择是

    a = list('abcdefghij'); b = range(10)
    desc = {'names': ('a', 'b'), 'formats': ('S4', 'f4')}
    d = numpy.array(zip(a, b), dtype=desc)
    

    【讨论】:

    • 但是如果我已经有c,但没有源列表ab,我该怎么办?当我这样做时:d = numpy.array(zip(c), dtype=desc),我收到以下错误TypeError: expected a readable buffer object
    • 我找到了解决我之前评论的方法,但它看起来很丑。 d = array(map(lambda l: tuple(l[0]), zip(c)), dtype=desc)。有没有更好的选择?
    【解决方案2】:

    根据您对 Sven 回答的评论,如果您没有 ab,请执行以下操作并稍后填充 c

    from numpy import recarray
    
    desc = {'names': ('a', 'b'), 'formats': ('S4', 'f4')}
    c = recarray((10,),dtype=desc)
    
    a = list('abcdefghij'); b = range(10)
    
    c['a'] = a
    c['b'] = b
    
    print r
    

    给予,

    [('a', 0.0) ('b', 1.0) ('c', 2.0) ('d', 3.0) ('e', 4.0) ('f', 5.0)
     ('g', 6.0) ('h', 7.0) ('i', 8.0) ('j', 9.0)]
    

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 2014-08-04
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2013-12-13
      • 2016-06-28
      • 1970-01-01
      • 2022-10-02
      相关资源
      最近更新 更多