我有一些数据用dtype=object存储为numpy数组,我想提取列表的一列并将其转换为numpy数组。看来这是一个简单的问题,但是我发现解决此问题的唯一方法是将整个内容重铸为列表列表,然后将其重铸为numpy数组。还有更Python化的方法吗?

import numpy as np

arr = np.array([[1, ['a', 'b', 'c']], [2, ['a', 'b', 'c']]], dtype=object)
arr = arr[:, 1]

print(arr)
# [['a', 'b', 'c'] ['a', 'b', 'c']]

type(arr)
# numpy.ndarray
type(arr[0])
# list

arr.shape
# (2,)

将数组重铸为dtype=str会引发一个ValueError,因为它试图将每个列表转换为字符串。
arr.astype(str)
# ValueError: setting an array element with a sequence

可以将整个数组重建为列表列表,然后将其强制转换为numpy数组,但这似乎是一种回旋方式。
arr_2 = np.array(list(arr))

type(arr_2)
# numpy.ndarray
type(arr_2[0])
# numpy.ndarray

arr_2.shape
# (2, 3)

有一个更好的方法吗?

最佳答案

虽然通过列表的方式比通过vstack的方式要快:

In [1617]: timeit np.array(arr[:,1].tolist())
...
100000 loops, best of 3: 11.5 µs per loop
In [1618]: timeit np.vstack(arr[:,1])
...
10000 loops, best of 3: 54.1 µs per loop
vstack正在执行:
np.concatenate([np.atleast_2d(a) for a in arr[:,1]],axis=0)

一些替代方案:
In [1627]: timeit np.array([a for a in arr[:,1]])
100000 loops, best of 3: 18.6 µs per loop
In [1629]: timeit np.stack(arr[:,1],axis=0)
10000 loops, best of 3: 60.2 µs per loop

请记住,对象数组仅包含指向列表的指针,这些列表位于内存中。 arr的2d性质使选择第二列变得容易,而arr[:,1]实际上是列表的列表。而且对其进行的大多数操作都将其视为此类。像reshape这样的东西不会越过object边界。

关于python - 将列表的numpy数组转换为numpy数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40250501/

10-11 23:18
查看更多