如何将两种不同类型的数据string和int添加到numpy ndarray

时间:2017-09-28 05:51:13

标签: python numpy types

我使用pandas.read_csv读取excel文件,我的文件中有两列,一列是字符串类型,另一列是整数。

data = pandas.read_csv('data.csv')

然后,我为这些numpy ndarrays打印出这些数据类型。

print(type(data.get_values()[0, 0]))
print(type(data.get_values()[0, 1]))

结果:

<class 'str'>
<class 'int'>

它告诉我有一种方法可以在同一个numpy ndarrays中添加两种不同的数据类型。

然而,当我想尝试在同一个numpy ndarrays中添加两种不同数据类型的数据时:

arr = numpy.ndarray((1, 2))
arr[0][0] = 1
arr[0][1] = 'str'

控制台向我显示了这些信息:

ValueError: could not convert string to float: 'str'

有没有人可以像班级熊猫那样告诉我怎么做?

1 个答案:

答案 0 :(得分:2)

您可以为每个字段创建具有任意C样式数据类型的numpy ndarray。诀窍首先是create the datatype for the array,然后将其设置为数组的dtype。唯一令人烦恼的是,因为它们是C风格的类型,所以必须明确定义类型,如果你有字符串,则包括设置每个字段可以包含的字符数。

例如:

>>> import numpy as np
>>> person_dt = np.dtype([('Name', 'S25'), ('Age', np.uint8)])
>>> person_dt
dtype([('Name', 'S25'), ('Age', 'u1')])
>>> persons = np.array([('alice', 35), ('bob', 39)], dtype=person_dt)
>>> persons
array([(b'alice', 35), (b'bob', 39)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])

我在这里创建了一个numpy dtype。数组的每个单独部分都是field,我将NameAge分配给这些字段的名称,并为每个字段指定类型。所以Name字段是一个25个字符或更少的字符串(这是一个\0终止的字符串,就像你在C中所拥有的那样,而且年龄是无符号整数,因为我们的年龄当然会更少请注意{4}之前的b表示类型为byte-string

然后我只使用新的dtype创建数组并传入值。

关于这一点很酷,你可以获取它们所属的字段的值。例如,您可以通过抓取Age字段获取所有年龄段,并且它将具有我指定年龄的类型:

>>> persons['Age']
array([35, 39], dtype=uint8)

所以你可以进一步索引这些结果数组:

>>> persons['Name'][1]
b'bob'

您仍然可以像平常一样创建和分配:

>>> new_persons = np.zeros(5, dtype=person_dt)
>>> new_persons
array([(b'', 0), (b'', 0), (b'', 0), (b'', 0), (b'', 0)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])
>>> new_persons[0] = ('alice', 25)
>>> new_persons[1] = ('bob', 26)
>>> new_persons['Name'][2:5]
array([b'', b'', b''],
      dtype='|S25')
>>> new_persons['Name'][2:5] = 'carol', 'david', 'eve'
>>> new_persons['Age'][2:5] = 27, 28, 29
>>> new_persons
array([(b'alice', 25), (b'bob', 26), (b'carol', 27), (b'david', 28), (b'eve', 29)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])

我刚才参加了一个关于创建和管理numpy dtypes的演讲,这很棒;谈话的Jupyter笔记本是在线的,您可以access it here,这可能会更清楚地说明您可以使用它们的所有不同方式。