我有一个列表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')
答案 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
元素这样的元组。