Как numpy суммировать повторный диапазон - PullRequest
0 голосов
/ 16 апреля 2020

Как numpy суммировать диапазон? Например, приведенный ниже массив.

array([[1,2],
       [3,4],
       [5,6],
       [7,8],
       ...
       [i,j]])

Я бы хотел, чтобы после суммирования взять два из столбца 1, а среднее взять два из столбца 2.
[4,3] = [sum (1, 3), среднее (2,4)] ...

array([[4,3],
       [12,7],
       ...

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Вы можете сделать следующее:

np.vstack((my_array[::2, 0] + my_array[1::2, 0], (my_array[::2, 1] + my_array[1::2, 1]) / 2)).T

Это все numpy индексирование действительно. my_array[::2, 0] будет массивом:

[1, 5, ...]

, в то время как my_array[1::2, 0] является массивом:

[3, 7, ...]

Следовательно, вы можете добавить их, чтобы получить первый столбец полученного массива. Обратите внимание, что это приводит к массиву с формой (n, ). Вы можете сделать то же самое для вычисления среднего значения, но вы должны изменить 0 на 1, чтобы получить второй столбец.

Как только вы получите два массива, вы можете сложить их по вертикали, используя vstack и, наконец, взять транспонирование с атрибутом T, чтобы получить правильную форму.

Я не уверен, что это более эффективный способ сделать это.

3 голосов
/ 16 апреля 2020

Вот трюк, чтобы выполнить свою работу:

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.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...