据我了解,将 NumPy 数组转换为本机 Python 列表的推荐方法是使用ndarray.tolist
.
唉,这在使用结构化数组时似乎无法递归工作。事实上,一些ndarray
对象在结果列表中被引用,未转换:
>>> dtype = numpy.dtype([('position', numpy.int32, 3)])
>>> values = [([1, 2, 3],)]
>>> a = numpy.array(values, dtype=dtype)
>>> a.tolist()
[(array([1, 2, 3], dtype=int32),)]
我确实编写了一个简单的函数来解决这个问题:
def array_to_list(array):
if isinstance(array, numpy.ndarray):
return array_to_list(array.tolist())
elif isinstance(array, list):
return [array_to_list(item) for item in array]
elif isinstance(array, tuple):
return tuple(array_to_list(item) for item in array)
else:
return array
使用时,它提供了预期的结果:
>>> array_to_list(a) == values
True
这个函数的问题是它ndarray.tolist
通过重新创建它输出的每个列表/元组来重复工作。不是最优的。
所以问题是:
- 这种行为是
ndarray.tolist
可以预期的吗? - 有没有更好的方法来实现这一点?