【发布时间】:2016-09-15 12:04:49
【问题描述】:
据我了解,将 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的这种行为是否可以预料? - 有没有更好的方法来实现这一点?
【问题讨论】:
-
对我来说,结构化数组作为带有列表值的字典(反之亦然)比列表列表更有意义。
-
Dict 确实有意义,但列表列表也是如此,因为结构化数组的字段在 dtype 中定义为有序列表。最重要的是,NumPy 理解用于初始化数组的
values变量,即使它是以非字典格式定义的,所以列表列表在这里绝对是一个有效的结构。
标签: python numpy structured-array