Как сделать структурированный массив из нескольких простых массивов - PullRequest
1 голос
/ 22 ноября 2011
import numpy as np

a=np.array([1,2,3,4,5,6,7,8,9])
b=np.array(["a","b","c","d","e","f","g","h","i"])
c=np.array([9,8,7,6,5,4,3,2,1])
datatype=np.dtype({
 'names':['num','char','len'],
 'formats':['i','S32','i']
})

d=np.array(zip(a,b,c),dtype=datatype)

приведенный выше код использует zip (), чтобы сначала создать список, а затем преобразовать его в структурированный массив. Это низкая эффективность, я хочу знать, есть ли встроенные функции, которые могут сделать это в NumPy.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Вы также можете попробовать numpy.rec.fromarrays.

import numpy as np

a=np.array([1,2,3,4,5,6,7,8,9])
b=np.array(["a","b","c","d","e","f","g","h","i"])
c=np.array([9,8,7,6,5,4,3,2,1])

d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len'])

Хотя время не так хорошо, как при использовании itertools.

In [2]: %timeit d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len'])
10000 loops, best of 3: 86.5 us per loop

In [6]: import itertools

In [7]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype)
100000 loops, best of 3: 11.5 us per loop
2 голосов
/ 22 ноября 2011

zip создает список кортежей, который может потребовать много памяти, если массивы большие.Вы можете использовать itertools.izip для большей эффективности памяти:

import itertools
d=np.fromiter(itertools.izip(a,b,c),dtype=datatype)

Для небольших массивов длины ~ 10:

In [68]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype)
100000 loops, best of 3: 15.8 us per loop

In [69]: %timeit np.array(zip(a,b,c),dtype=datatype)
10000 loops, best of 3: 20.8 us per loop

Для массивов длины ~ 10000:

In [72]: A=np.tile(a,1000)
In [74]: B=np.tile(b,1000)
In [75]: C=np.tile(c,1000)

In [83]: %timeit np.fromiter(itertools.izip(A,B,C),dtype=datatype)
100 loops, best of 3: 10.7 ms per loop

In [84]: %timeit np.array(zip(A,B,C),dtype=datatype)
100 loops, best of 3: 12.7 ms per loop

Так что np.fromiter выглядит немного быстрее, чем np.array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...