python dict to numpy structured array python dict to numpy structured array python python

python dict to numpy structured array


You could use np.array(list(result.items()), dtype=dtype):

import numpy as npresult = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}names = ['id','data']formats = ['f8','f8']dtype = dict(names = names, formats=formats)array = np.array(list(result.items()), dtype=dtype)print(repr(array))

yields

array([(0.0, 1.1181753789488595), (1.0, 0.5566080288678394),       (2.0, 0.4718269778030734), (3.0, 0.48716683119447185), (4.0, 1.0),       (5.0, 0.1395076201641266), (6.0, 0.20941558441558442)],       dtype=[('id', '<f8'), ('data', '<f8')])

If you don't want to create the intermediate list of tuples, list(result.items()), then you could instead use np.fromiter:

In Python2:

array = np.fromiter(result.iteritems(), dtype=dtype, count=len(result))

In Python3:

array = np.fromiter(result.items(), dtype=dtype, count=len(result))

Why using the list [key,val] does not work:

By the way, your attempt,

numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)

was very close to working. If you change the list [key, val] to the tuple (key, val), then it would have worked. Of course,

numpy.array([(key,val) for (key,val) in result.iteritems()], dtype)

is the same thing as

numpy.array(result.items(), dtype)

in Python2, or

numpy.array(list(result.items()), dtype)

in Python3.


np.array treats lists differently than tuples: Robert Kern explains:

As a rule, tuples are considered "scalar" records and lists are recursed upon. This rule helps numpy.array() figure out which sequences are records and which are other sequences to be recursed upon; i.e. which sequences create another dimension and which are the atomic elements.

Since (0.0, 1.1181753789488595) is considered one of those atomic elements, it should be a tuple, not a list.


Even more simple if you accept using pandas :

import pandasresult = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}df = pandas.DataFrame(result, index=[0])print df

gives :

          0         1         2         3  4         5         60  1.118175  0.556608  0.471827  0.487167  1  0.139508  0.209416


Let me propose an improved method when the values of the dictionnary are lists with the same lenght :

import numpydef dctToNdarray (dd, szFormat = 'f8'):    '''    Convert a 'rectangular' dictionnary to numpy NdArray    entry         dd : dictionnary (same len of list     retrun        data : numpy NdArray     '''    names = dd.keys()    firstKey = dd.keys()[0]    formats = [szFormat]*len(names)    dtype = dict(names = names, formats=formats)    values = [tuple(dd[k][0] for k in dd.keys())]    data = numpy.array(values, dtype=dtype)    for i in range(1,len(dd[firstKey])) :        values = [tuple(dd[k][i] for k in dd.keys())]        data_tmp = numpy.array(values, dtype=dtype)        data = numpy.concatenate((data,data_tmp))    return datadd = {'a':[1,2.05,25.48],'b':[2,1.07,9],'c':[3,3.01,6.14]}data = dctToNdarray(dd)print data.dtype.namesprint data