我有一个原始np.array()
,我会在其上明确指出列的类型。
data
数组的格式如下:
data = [
[name1, float1, float2, float3]
# ...
[nameX, floatX, floatX, floatX]
]
现在,为了明确指定列类型,我执行以下操作:
data = np.array(data, dtype=[('name', str), ('amount0', float), ('amount1', float), ('amount2', float)])
非常直接。
但是,出于某种原因我不明白我收到了以下错误:
ValueError:无法将字符串转换为float:' john_smith'
'john_smith'
是第一列数据(data[:,0]
)中的值,因为我将其定义为字符串,我甚至不理解为什么它会尝试将其转换为一个浮子。
另外:'john_smith'
既不是数据数组的第一个也是最后一个元素。
那么,这里有什么问题?
工作示例:
import numpy as np
row1 = ['julien', '6270', '17', '0.2703992365198028']
row2 = ['john_smith', '2983', '10', '0.3341129301703976']
row3 = ['helo', '19', '0', '0.0']
data = []
data.append(row1)
data.append(row2)
data.append(row3)
data = np.array(data)
data = np.array(data, dtype=[('name', str), ('amount0', float), ('amount1', float), ('amount2', float)])
答案 0 :(得分:1)
您似乎误解了结构化数组的工作原理。您没有指定"列的数据类型",您指定了结构的数据类型,并构建了一个结构数组。 Numpy
数组是同类数组,不能有混合数据类型。所以,你可以这样做:
>>> e1 = ('julien', 6270, 17, 0.2703992365198028)
>>> e2 = ('john_smith', '2983', '10', '0.3341129301703976')
>>> e3 = ('helo', '19', '0', '0.0')
>>> data = [e1, e2, e3]
>>> arr = np.array(data, dtype=[('name', '<U255'), ('amount0', float), ('amount1', float), ('amount2', float)])
>>> arr
array([('julien', 6270.0, 17.0, 0.2703992365198028),
('john_smith', 2983.0, 10.0, 0.3341129301703976),
('helo', 19.0, 0.0, 0.0)],
dtype=[('name', '<U255'), ('amount0', '<f8'), ('amount1', '<f8'), ('amount2', '<f8')])
>>>
但请注意,
>>> arr.shape
(3,)
没有列。当然,我们可以假装有:
>>> arr['name']
array(['julien', 'john_smith', 'helo'],
dtype='<U255')
>>> arr[0]['name']
'julien'
但老实说,听起来你真的想要pandas.DataFrame
>>> import pandas as pd
>>> pd.DataFrame(data, columns=['name', 'amount0', 'amount1', 'amount2'])
name amount0 amount1 amount2
0 julien 6270 17 0.270399
1 john_smith 2983 10 0.3341129301703976
2 helo 19 0 0.0
>>>
注意,我必须修改您的str
数据类型以接受unicode
,因为numpy
将str
解释为字节字符串。您始终可以通过编码来创建字符串bytes
对象。如果您只使用ascii字符,这可能是要走的路。
答案 1 :(得分:1)
提供给 numpy.array 的数据应该是元组列表,而不是列表列表。您的示例需要进行两项更改 - 行是元组,不要将数据转换为数组。
import numpy as np
row1 = ('julien', '6270', '17', '0.2703992365198028')
row2 = ('john_smith', '2983', '10', '0.3341129301703976')
row3 = ('helo', '19', '0', '0.0')
data = []
data.append(row1)
data.append(row2)
data.append(row3)
data = np.array(data, dtype=[('name', str), ('amount0', float), ('amount1', float), ('amount2', float)])