Numpy: не удалось передать входной массив из shape (3) в shape (1) - PullRequest
0 голосов
/ 30 января 2019

Я хочу создать массив NumPy b , где каждый компонент является 2D-матрицей, размеры которой определяются координатами вектора a .

Меня устраивает то, что я получаю, выполняя следующее:

>>> a = [3,4,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> np.array(b)
array([ array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]]),
       array([[ 0.,  0.,  0.,  0.,  0.]])], dtype=object)

но если я обнаружил этот патологический случай, когда он не работает:

>>> a = [2,1,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> b
[array([[ 0.,  0.,  0.]]), array([[ 0.,  0.]])]
>>> np.array(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3) into shape (1)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Это немного странно.Как правило, numpy будет пытаться создать один массив из ввода np.array с общим типом данных.Список массивов будет интерпретироваться вместе со списком как новое измерение.Например, np.array([np.zeros(3, 1), np.zeros(3, 1)]) будет производить массив 2 x 3 x 1.Так что это может произойти, только если массивы в вашем списке совпадают по форме.В противном случае вы получите массив массивов (с dtype=object), который, как прокомментировано, на самом деле не является идеальным сценарием.

Однако ваша ошибка, по-видимому, возникает при совпадении первого измерения.Numpy почему-то пытается каким-то образом транслировать массивы и терпит неудачу.Я могу воспроизвести вашу ошибку, даже если массивы имеют более высокое измерение, при условии совпадения первого измерения между массивами.

Я знаю, что это не решение, но это не помещается в комментарии.Как отмечает @roganjosh, создание такого массива действительно не приносит никакой пользы.Вам лучше придерживаться списка массивов для удобства чтения и избежать затрат на создание этих массивов.

0 голосов
/ 30 января 2019

Я представлю решение проблемы, но учту то, что было сказано в комментариях.Наличие не выровненных массивов Numpy не позволяет большинству полезных операций применить свое волшебство.Попробуйте вместо этого использовать списки.

При этом, действительно, любопытная ошибка.Я заставил это работать, назначив базовый цикл for вместо вызова np.array.

a = [2,1,1]
b = np.zeros(len(a)-1, dtype=object)
for i in range(1, len(a)):
    b[i-1] = np.zeros((a[i], a[i - 1] + 1))

И результат:

>>> b
array([array([[0., 0., 0.]]), array([[0., 0.]])], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...