无法在nparray中使用dtype将字符串转换为float

时间:2017-03-10 20:49:49

标签: python arrays python-3.x numpy

我有一个原始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)])

2 个答案:

答案 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,因为numpystr解释为字节字符串。您始终可以通过编码来创建字符串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)])