#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)
суммы по столбцам