在Numpy中用字符串和整数从列表创建结构数组

1 投票
2 回答
1096 浏览
提问于 2025-04-29 11:27

我看过文档,但还是搞不清楚怎么用numpy创建一个包含字符串和整数的结构化数组。下面是我问题的简化版本:

foo = [['asd', 1, 2],['bgf',2,3]]
bar = np.array(foo, dtype=['S10', 'i4','i4'])

我希望能把bar[:,0]设置成字符串数组,而bar[:,1]bar[:,2]设置成整数数组。

可惜这样做会出现TypeError: data type not understood的错误。我试过很多其他方法,但都没有找到简单易懂的解决办法。

现在我只是用bar = np.array(foo)来创建数组,然后在调用第二列或第三列的值时再转换成整数,这样做实在不太理想。

我该如何从列表的列表foo中创建我想要的结构化数组bar呢?

暂无标签

2 个回答

1

如果一个数组里有多种数据类型,就要使用 dtype=object

>>> bar = np.array(foo, dtype=object)
>>> bar[:,0]
array(['asd', 'bgf'], dtype=object)
>>> bar[:,1]
array([1, 2], dtype=object)
>>> bar[:,2]
array([2, 3], dtype=object)
2

这里有一种创建结构化数组的方法:

>>> foo = [('asd', 1, 2),('bgf',2,3)]
>>> bar = np.array(foo, dtype='S10,i4,i4')
>>> bar
array([('asd', 1, 2), ('bgf', 2, 3)], 
      dtype=[('f0', 'S10'), ('f1', '<i4'), ('f2', '<i4')])
>>> bar['f0']
array(['asd', 'bgf'], 
      dtype='|S10')
>>> bar['f1']
array([1, 2], dtype=int32)
>>> bar['f2']
array([2, 3], dtype=int32)

如果你想要一个普通的数组,也就是里面有元素而不是字段的话,可以使用 dtype=object

撰写回答