2

我正在尝试将列表列表转换为数组,并且发生了一些奇怪的事情。

例如,如果我将列表声明为:

a=[]
a.append(['a',1,10,100])
a.append(['b',2,20,200])
a.append(['c',3,30,300])
a.append(['d',4,40,400])

然后通过转换成向量

a=np.array(a)

最终结果是

[['a','1','1','1'],['b','2','2','2'],['c','3','3','3'],['d','4','4','4']]

我是一个完全的 Python 初学者,但是根据我使用 np.array 阅读的内容,向量中的所有内容都被转换为字符串(如果我错了,请纠正我)。为什么在这里忽略零,我该怎么做才能修复它?

4

3 回答 3

5

由于您的数组具有非统一的数据类型,因此您必须指定“结构化”dtype

In [2]: a = [('a', 1, 10, 100),
   ...:      ('b', 2, 20, 200),
   ...:      ('c', 3, 30, 300),
   ...:      ('d', 4, 40, 400)]

In [3]: a = np.array(a, dtype = "S1, int, int, int")

In [4]: a
Out[4]: 
array([('a', 1, 10, 100),
       ('b', 2, 20, 200),
       ('c', 3, 30, 300),
       ('d', 4, 40, 400)], 
      dtype=[('f0', 'S1'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')])

您可以通过以下方式轻松访问:

In [5]: a.dtype.names = ['name','x','y','z']

In [6]: a['x']
Out[6]: array([1, 2, 3, 4])

In [7]: a['name']
Out[7]: 
array(['a', 'b', 'c', 'd'], 
      dtype='|S1')

In [8]: a[0]
Out[8]: ('a', 1, 10, 100)
于 2013-04-03T15:36:25.970 回答
3

这是因为数组的结果数据类型(numpy 不得不猜测)是“长度为 1 的字符串”。您需要指定最大项目大小:

In [51]: np.array(['a', 10])
Out[51]:
array(['a', '1'],
      dtype='|S1')

In [56]: np.array(['a', 10], dtype=(str, 5))
Out[56]:
array(['a', '10'],
      dtype='|S5')

In [57]: np.array(['a', 123456], dtype=(str, 5))
Out[57]:
array(['a', '12345'],
      dtype='|S5')

In [58]: np.array(['a', 123456], dtype=(str, 6))
Out[58]:
array(['a', '123456'],
      dtype='|S6')

Numpy 数据类型

你确定你的二维数组不应该是一维记录数组(见 askewchan 的回答)?

于 2013-04-03T15:31:31.650 回答
3

使用np.array不会将所有内容都转换为字符串。numpy.array说:

"dtype : data-type, optional 数组所需的数据类型。如果未给出,则类型将被确定为保存序列中对象所需的最小类型。此参数只能用于'upcast'阵列。”

一般来说,使用 numpy 你不应该混合类型。在你的例子中,你做到了。我的猜测是,numpy 试图猜测你的参数的正确类型,这导致向上转换为类似字符串的东西。但它确实出错了。我对 numpy 的经验不足以准确地说出发生了什么。所以也许更聪明的人会解决这个问题。我建议numpy.dtype进一步阅读。你可以用它做一些魔术。

我的建议是在创建时坚持一种类型numpy.array。特别是因为它旨在执行计算,而您试图潜入一些字符串/字符。我不确定你想做什么计算。

编辑:是的,我想我是个麻木的菜鸟。结构化 dtype 似乎是混合类型数组的完美方式。

于 2013-04-03T15:36:04.050 回答