Под "обычным массивом" я понимаю, что вы имеете в виду массив 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