将元组列表转换为结构化的numpy数组

时间:2015-01-27 17:58:27

标签: python arrays numpy

我有一个 Num_tuples 元组的列表,它们都具有相同的长度 Dim_tuple

xlist = [tuple_1, tuple_2, ..., tuple_Num_tuples]

为了明确,我们假设Num_tuples = 3且Dim_tuple = 2

xlist = [(1, 1.1), (2, 1.2), (3, 1.3)]

我想使用用户提供的列名 user_names 和用户提供的列表将 xlist 转换为结构化numpy数组 xarr 变量类型列表 user_types

user_names = [name_1, name_2, ..., name_Dim_tuple]
user_types = [type_1, type_2, ..., type_Dim_tuple]

所以在创建numpy数组时,     dtype = [(name_1,type_1),(name_2,type_2),...,(name_Dim_tuple,type_Dim_tuple)]

在我的玩具示例中,所需的最终产品看起来像:

xarr['name1']=np.array([1,2,3])
xarr['name2']=np.array([1.1,1.2,1.3])

如何在没有任何循环的情况下切片 xlist 来创建 xarr

1 个答案:

答案 0 :(得分:25)

元组列表是向结构化数组提供数据的正确方法:

In [273]: xlist = [(1, 1.1), (2, 1.2), (3, 1.3)]

In [274]: dt=np.dtype('int,float')

In [275]: np.array(xlist,dtype=dt)
Out[275]: 
array([(1, 1.1), (2, 1.2), (3, 1.3)], 
      dtype=[('f0', '<i4'), ('f1', '<f8')])

In [276]: xarr = np.array(xlist,dtype=dt)

In [277]: xarr['f0']
Out[277]: array([1, 2, 3])

In [278]: xarr['f1']
Out[278]: array([ 1.1,  1.2,  1.3])

或者名称是否重要:

In [280]: xarr.dtype.names=['name1','name2']

In [281]: xarr
Out[281]: 
array([(1, 1.1), (2, 1.2), (3, 1.3)], 
      dtype=[('name1', '<i4'), ('name2', '<f8')])

http://docs.scipy.org/doc/numpy/user/basics.rec.html#filling-structured-arrays