Как найти квадрат отдельных элементов массивов numpy разного размера в списке

#python #numpy

#python #numpy

Вопрос:

Рассмотрим, что у меня есть следующий список np-массивов:

 >>> l = []
>>> l.append(np.array([[1,2,3],[4,5,6]]))
>>> l.append(np.array([[7,8],[9,10]]))
>>> l.append(np.array([[7,8],[9,10],[11,12]])) 
  

Я хочу найти сумму квадратов каждого отдельного значения всех массивов numpy в этом списке. Выполнение следующих действий:

 >>> np.sum(np.square(l)) 
  

выдает следующую ошибку:

 ValueError: operands could not be broadcast together with shapes (2,3) (2,2)
  

Как я могу сделать это более питоническим или нумитоническим способом? Должен ли я вручную перебирать каждый массив numpy, чтобы найти их квадраты, а затем суммировать вручную, как показано ниже?

 >>> np.sum(list(map(lambda i: np.sum(np.square(i)),l)))
944
  

PS:

Для следующего списка

 >>> l                                     
[array([[1, 2, 3],
       [4, 5, 6]]), array([[ 7,  8],
       [ 9, 10]])]
  

Я могу это сделать:

 >>> np.sum(np.square(np.hstack(l)))  
385
  

Но, похоже, существуют некоторые ограничения на размеры входного списка для hstack() работы, поскольку он выдает аналогичную ошибку в первом списке.

Ответ №1:

Должен ли я вручную перебирать каждый массив numpy, чтобы найти их квадраты, а затем суммировать вручную, как показано ниже?

По сути, да. У вас есть список массивов numpy с несовместимыми формами / длинами. Это означает, что вы выходите за рамки модели массива numpy. Но ваша реализация может быть немного более плавной:

 sum(np.sum(np.square(a)) for a in l)