Добавить массив numpy в поблочный

#python #arrays #numpy

#питон #массивы #тупой

Вопрос:

У меня есть массив numpy, сгенерированный некоторым более ранним кодом, который необходимо добавить поблочно. Например, массив a имеет 32 записи и должен быть добавлен таким образом, чтобы новый массив b имел 4 записи и b[0] имел номера 0-7, b[1] 8-15 и так далее. Смотрите пример ниже о том, как это сделать вручную.

 import numpy as np
a = np.random.rand(32)
b = np.zeros(4)
b[0] = np.sum(a[0:8])
b[1] = np.sum(a[8:16])
b[2] = np.sum(a[16:24])
b[3] = np.sum(a[24:32])
 

Теперь я знаю, что могу выполнить суммирование с помощью цикла for, но я надеялся на что-то более причудливое, так как я работаю с довольно большими массивами. Я знаю о великой магии нарезки numpy, поэтому я предполагаю, что можно было бы использовать что-то подобное.

Ответ №1:

Я бы использовал что-то вроде этого:

 #import random
import numpy as np
np.random.seed(11) # random.seed doesnt affect numpy computation as pointed out in the comments 

a = np.random.rand(32)
b = np.zeros(4)
a = np.reshape(a, (4,-1))
b = np.sum(a, axis=1)
 

Комментарии:

1. Что это -1 значит?

2. Одно из измерений в reshape может быть -1 . В этом случае значение выводится из длины массива и остальных размеров. Полный документ здесь numpy.org/doc/stable/reference/generated /…

3. Это отлично работает, спасибо. Можно было бы использовать только небольшое улучшение np.random.seed , поскольку в настоящее время ваше начальное значение не влияет на numpy, и каждый запуск будет давать разные результаты. Обратите внимание, что это может зависеть от версии, я помню, что некоторые библиотеки напрямую используют random свое внутреннее состояние, но, по крайней мере, последние версии numpy отслеживают свое собственное состояние, на которое не влияют другие пакеты.

4. Спасибо, соответствующим образом обновлю ответ.