Как преобразовать numpy.recarray в numpy.array? - PullRequest
14 голосов
/ 21 октября 2011

Какой лучший способ преобразовать numpy's recarray в обычный массив?

Я мог бы сначала сделать .tolist(), а затем снова array(), но это кажется несколько неэффективным ..

Пример:

import numpy as np
a = np.recarray((2,), dtype=[('x', int), ('y', float), ('z', int)])

>>> a
  rec.array([(30408891, 9.2944097561804909e-296, 30261980),
   (44512448, 4.5273310988985789e-300, 29979040)], 
  dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])

>>> np.array(a.tolist())
   array([[  3.04088910e+007,   9.29440976e-296,   3.02619800e+007],
   [  4.45124480e+007,   4.52733110e-300,   2.99790400e+007]])

1 Ответ

12 голосов
/ 21 октября 2011

Под "обычным массивом" я понимаю, что вы имеете в виду массив NumPy однородного типа d.С учетом повторного массива, такого как:

>>> a = np.array([(0, 1, 2),
              (3, 4, 5)],[('x', int), ('y', float), ('z', int)]).view(np.recarray)
rec.array([(0, 1.0, 2), (3, 4.0, 5)], 
      dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])

, мы должны сначала сделать каждый столбец одинаковым dtype.Затем мы можем преобразовать его в «обычный массив», просмотрев данные с тем же типом d:

>>> a.astype([('x', '<f8'), ('y', '<f8'), ('z', '<f8')]).view('<f8')
array([ 0.,  1.,  2.,  3.,  4.,  5.])

astype возвращает новый массив numpyТаким образом, вышесказанное требует дополнительной памяти в количестве, пропорциональном размеру a.Каждая строка a требует 4 + 8 + 4 = 16 байтов, а a.astype(...) требует 8 * 3 = 24 байта.Вызов view не требует новой памяти, поскольку view просто меняет способ интерпретации базовых данных.

a.tolist() возвращает новый список Python.Каждый номер Python является объектом, который требует больше байтов, чем его эквивалентное представление в массиве numpy.Так что a.tolist() требует больше памяти, чем a.astype(...).

Вызов a.astype(...).view(...) также быстрее, чем np.array(a.tolist()):

In [8]: a = np.array(zip(*[iter(xrange(300))]*3),[('x', int), ('y', float), ('z', int)]).view(np.recarray)

In [9]: %timeit a.astype([('x', '<f8'), ('y', '<f8'), ('z', '<f8')]).view('<f8')
10000 loops, best of 3: 165 us per loop

In [10]: %timeit np.array(a.tolist())
1000 loops, best of 3: 683 us per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...