Как правильно использовать массивы записей Python - PullRequest
0 голосов
/ 19 мая 2011

Я хотел бы объединить несколько списков или массивов в один массив записей.В следующем коде я хочу создать массив записей с двумя столбцами: «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, а не только из отдельных списков.После ответа Свена Марнача у меня было несколько попыток и ошибок, и вот что я получил:

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

Это кажется довольно уродливым решением.У кого-нибудь есть лучший?

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Существуют разные способы достижения вашего результата. Один простой вариант -

a = list('abcdefghij'); b = range(10)
desc = {'names': ('a', 'b'), 'formats': ('S4', 'f4')}
d = numpy.array(zip(a, b), dtype=desc)
1 голос
/ 19 мая 2011

Исходя из вашего комментария к ответу Свена, если у вас нет 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...