Można zrobić pusty uporządkowaną tablicę odpowiedniej wielkości i dtype, a następnie wypełnić go z listy.
http://docs.scipy.org/doc/numpy/user/basics.rec.html
tablice strukturalne mogą być wypełnione przez pole lub wiersz po wierszu. ... Jeśli wypełnić go wiersz po wierszu, to zajmuje się krotki (ale nie listę lub tablicę!):
In [72]: dt=dtype([('weight',int),('animal','S10')])
In [73]: values = [tuple(each.values()) for each in d]
In [74]: values
Out[74]: [(5, 'cat'), (20, 'dog')]
pola w dt
występują w takiej samej kolejności jak w values
.
In [75]: a=np.zeros((2,),dtype=dt)
In [76]: a[:]=[tuple(each.values()) for each in d]
In [77]: a
Out[77]:
array([(5, 'cat'), (20, 'dog')],
dtype=[('weight', '<i4'), ('animal', 'S10')])
Przy odrobinie więcej testów odkryłem, że mogę utworzyć macierz bezpośrednio z values
.
In [83]: a = np.array(values, dtype=dt)
In [84]: a
Out[84]:
array([(5, 'cat'), (20, 'dog')],
dtype=[('weight', '<i4'), ('animal', 'S10')])
The dtype
można było wywnioskować z jednego (lub więcej) słownika przedmiotów:
def gettype(v):
if isinstance(v,int): return 'int'
elif isinstance(v,float): return 'float'
else:
assert isinstance(v,str)
return '|S%s'%(len(v)+10)
d0 = d[0]
names = d0.keys()
formats = [gettype(v) for v in d0.values()]
dt = np.dtype({'names':names, 'formats':formats})
produkcji:
dtype=[('weight', '<i4'), ('animal', 'S13')]
Jakie struktury danych chcesz skończyć z? Tylko szereg obiektów? – agconti
A NumPy [tablica rekordów] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html), więc mogę zrobić coś w stylu 'pets ['weight']' (co być "[5, 20]" w tym przypadku). – Roger