#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. Спасибо, соответствующим образом обновлю ответ.