Как суммировать каждую пару последовательных элементов в массиве?

#python #arrays #numpy

Вопрос:

У меня есть массив размера (1,10) :

 A = [1 2 3 4 5 6 7 8 9 10]
 

Теперь я хочу вычислить новый массив размером (1,5) :

 B = [3 7 11 15 19]
 

Который построен с помощью:

 3 = 1   2
7 = 3   4
...
19 = 9   10
 

Как я могу реализовать это в Python?

Ответ №1:

Вы можете индексировать массив в каждом n-м элементе с помощью синтаксиса [::n]

 a = np.arange(1,11)
a[::2]   a[1::2]
array([ 3,  7, 11, 15, 19])
 

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

1. Спасибо за ваш ответ, как насчет того, чтобы размер A (n,m) с m был четным числом m=2k;

2. вы можете индексировать любую ось , используя тот же синтаксис . Например a[:,::2] , будет дан каждый второй столбец и a[::2,:] будет дана каждая вторая строка.

Ответ №2:

Чтобы обобщить вопрос:

У вас есть массив A с размером 2n , и вы хотите получить массив B с размером n , чтобы каждый элемент B был суммой двух элементов, A взятых в последовательном порядке.

Самое простое решение-создать цикл for с n итерациями и выполнить суммирование для соответствующих элементов.

 A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.zeros(shape=(5), dtype=int)

for i in range(len(A) // 2):
  B[i]=(A[2*i]   A[2*i 1])

print(B)
 

Вы также можете использовать понимание списка:

 A = np.array([1,2,3,4,5,6,7,8,9,10])

B = np.array([A[2*i] A[2*i 1] for i in range(len(A)//2)])

print(B)
 

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

1. Спасибо вам за ваш ответ! Это сработало! Но теперь я хочу расширить массив до размера (m,2n). Как я могу это сделать?

2. Это ответ по списку. Создание массивов просто замедлит процесс.

3. @fpga Это очень похоже. Вместо этого будет «форма» B. (2n - m) // 2 Но я согласен с @hpaulj — это способ сделать это со списками, для массивов ответ @user1319128 может быть более эффективным.

Ответ №3:

A.shape равно (10,), а не (1,10).

  A.reshape(-1,2)
 

образует массив (5,2)

   A.reshape(-1,2).sum(axis=1)
 

суммы по столбцам