NumPy сохранение объекта с массивами другой формы, но с одинаковым начальным измерением - PullRequest
0 голосов
/ 26 июня 2018

Я испытал неожиданное поведение np.save(). Предположим, вы хотите сохранить два пустых массива в один файл .npy (как объект). До тех пор, пока оба массива имеют одинаковую форму, это работает без каких-либо проблем, но когда начальный размер одинаков, возникает ошибка. Проблема вызвана np.asanyarray(), который вызывается в np.save() перед сохранением. Понятно, что эту проблему можно решить, например, сохранение в разные файлы, но я не ищу другого решения, я хочу понять это поведение np.save().

Вот код:

import numpy as np
a = np.zeros((10, 5))
b = np.zeros((10, 2))
np.save('test', [a, b])

Вызывает эту ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/python3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 509, in save
arr = np.asanyarray(arr)
File "/python3/lib/python3.6/site-packages/numpy/core/numeric.py", line 544, in asanyarray
return array(a, dtype, copy=False, order=order, subok=True)
ValueError: could not broadcast input array from shape (10,5) into shape (10)

Когда ведущий размер отличается, проблем нет:

a = np.zeros((9, 5))
b = np.zeros((10, 2))
np.save('test', [a, b])

Для меня такое поведение np.save противоречиво и кажется ошибкой.

1 Ответ

0 голосов
/ 26 июня 2018

После просмотра источника asanarray метода здесь (save метод вызывает его внутри) Я вижу, что он пытается создать список ndarray, который передается с использованием метода array , Теперь, если они имеют разные размеры, он может создать ndarray с двумя различными элементами в нем. Однако, если они имеют одинаковое ведущее измерение, он пытается передать их вместе в один и тот же ndarray. Это связано с тем, что по умолчанию он пытается сделать вывод большого размера. Чтобы обойти это, вы можете сначала использовать метод empty для указания размеров, а затем использовать его для замены значений, таких как:

a=np.zeros((10,5))
b=np.zeros((10,2))
c=[a,b]
finalc = np.empty(len(c),dtype=object)
finalc[:]=c
np.save("file",c)
...