Насколько я понимаю, рекомендуемый способ преобразования массива NumPy в собственный список Python - использовать ndarray.tolist
.Действительно рекурсивный `tolist()` для структурированных массивов NumPy
Увы, это не работает рекурсивно при использовании структурированных массивов. Действительно, некоторые 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 со значениями списка (или наоборот), чем список списков. – Evert
Dict определенно имеет смысл, но также список списков, поскольку поля структурированного массива определены в dtype как упорядоченный список. Кроме того, NumPy понимает переменную 'values', которая используется для инициализации массива, даже если она определена в недискретном формате, поэтому список списков определенно является допустимой структурой. – ChristopherC