Вы можете создать логическую матрицу (маску), которая будет иметь True
для значений, которые вы хотите сохранить, и False
для тех, которые вам не нужны.
>>> mask = np.zeros((3,6), dtype='bool')
>>> mask[np.ix_([0,2],[0,2,4,5])] = True
>>> mask
array([[ True, False, True, False, True, True],
[False, False, False, False, False, False],
[ True, False, True, False, True, True]])
Затем вы можете взять Преимущество правил широковещательной рассылки numpy массива: применяют маску к массиву и суммируют по последним измерениям:
>>> new_sum = np.sum(e * mask.reshape(1,1,3,6), axis=(2,3))
>>> new_sum
array([[ 70, 214, 358],
[502, 646, 790]])
Вот небольшой код, который сравнивает характеристики двух версий на большей матрице:
import numpy as np
import time
N, P = 200, 100
e = np.arange(18*N*P).reshape(N, P, 3, 6)
t_start = time.time()
new_sum = np.empty((N,P))
for i in range(N):
for j in range(P):
temp_array = e[i,j,:,:]
new_sum[i,j] = np.sum(temp_array[np.ix_([0,2],[0,2,4,5])])
print(f'Timer 1: {time.time()-t_start}s')
t_start = time.time()
mask = np.zeros((3,6), dtype='bool')
mask[np.ix_([0,2],[0,2,4,5])] = True
new_sum_2 = np.sum(e * mask.reshape(1,1,3,6), axis=(2,3))
print(f'Timer 2: {time.time()-t_start}s')
print('Results are equal!' if np.allclose(new_sum, new_sum_2) else 'Results differ!')
Вывод:
% python3 script.py
Timer 1: 0.4343228340148926s
Timer 2: 0.002004384994506836s
Results are equal!
Как видите, вы получаете значительное улучшение с точки зрения времени вычислений.