Вот трюк, чтобы выполнить свою работу:
b = np.zeros((int(a.shape[0]/2), *a.shape[1:]))
b[:, 0] = np.sum(a.reshape(-1, 2, 2), axis=1).reshape(-1, 2)[:, 0]
b[:, 1] = np.mean(a.reshape(-1, 2, 2), axis=1).reshape(-1, 2)[:, 1]
, который в основном преобразуется, чтобы разделить данные на каждые две строки с помощью a.reshape(-1, 2, 2)
, затем выполнить любые необходимые вычисления и, наконец, преобразовать их обратно в оригинальная форма reshape(-1, 2)
. Вероятно, вы можете оптимизировать его, если для вас важна эффективность, удалив дополнительные столбцы вычислений num / mean.
РЕДАКТИРОВАТЬ: вы можете преобразовать ваш тип данных в int, если это требование:
b = b.astype(int)
вывод для массива:
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
is:
[[ 4 3]
[12 7]
[20 11]]
ОБНОВЛЕНИЕ: В случае общего диапазона.
Диапазон - это число строк, которые вы хотите объединить вместе, и в этом ответе предполагается, что количество строк в данных кратно диапазону. то есть массив может транслироваться в форме (-1,3,2):
range = 3
b = np.zeros((int(a.shape[0]/range), *a.shape[1:]))
b[:, 0] = np.sum(a.reshape(-1, range, 2), axis=1).reshape(-1, 2)[:, 0]
b[:, 1] = np.mean(a.reshape(-1, range, 2), axis=1).reshape(-1, 2)[:, 1]
Выход для диапазона 3:
[[ 9. 4.]
[27. 10.]]