Numpy dtype用于具有混合数据类型的列表

时间:2015-06-09 18:54:30

标签: python numpy

我有一个列表my_list,其中包含我想要转换为numpy数组的混合数据类型。但是,我收到错误TypeError: expected a readable buffer object。见下面的代码。我已尝试将代码基于NumPy documentation

my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5, 6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]]
my_np_array = np.array(my_list, dtype='S30, S8, i4, i4, f32')   

2 个答案:

答案 0 :(得分:12)

为什么不使用dtype=object

In [1]: my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5,
6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]]
In [2]: my_np_array = np.array(my_list, dtype=object)
In [3]: my_np_array
Out[3]:
array([['User_0', '2012-2', 1, 6, 0, 1.0],
       ['User_0', '2012-2', 5, 6, 0, 1.0],
       ['User_0', '2012-3', 0, 0, 4, 1.0]], dtype=object)

注意 它是关于内存使用的,当你指定每列的dtype时,分配给你的ndarray的内存将小于你使用包含python中所有可能类型的dtype=object所以分配的内存对于每列将是最大的。

答案 1 :(得分:5)

您的嵌套项目应为tuple,您在类型中省略了一个i4

>>> my_np_array = np.array(map(tuple,my_list), dtype='|S30, |S8, i4, i4, i4, f32')  
>>> my_np_array
array([('User_0', '2012-2', 1, 6, 0, 1.0),
       ('User_0', '2012-2', 5, 6, 0, 1.0),
       ('User_0', '2012-3', 0, 0, 4, 1.0)], 
      dtype=[('f0', 'S30'), ('f1', 'S8'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<f4')])

据我所知,当你使用多个类型的数组项时,numpy使用元组保留其类型,你需要将子数组转换为像dtype元素这样的元组。