我想将几个列表或数组合并到一个记录数组中。 在下面的代码中,我想创建一个包含两个列的记录数组:“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)
这似乎是一个非常难看的解决方案。有人有更好的吗?
答案 0 :(得分:3)
有不同的方法来实现您的结果。一个简单的选择是
a = list('abcdefghij'); b = range(10)
desc = {'names': ('a', 'b'), 'formats': ('S4', 'f4')}
d = numpy.array(zip(a, b), dtype=desc)
答案 1 :(得分:1)
根据您对Sven回答的评论,如果您没有a
和b
,请执行以下操作并稍后填充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)]