我有一些数据存储为dtype = object的numpy数组,我想提取一列列表并将其转换为numpy数组.这似乎是一个简单的问题,但我发现解决它的唯一方法是将整个事物重新编写为列表列表,然后将其重新设置为numpy数组.有更多的
pythonic方法吗?
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特性使得选择第2列变得容易,但arr [:,1]实际上是列表的列表.大多数操作都是这样处理的.像重塑这样的东西不会越过那个对象边界.