нарезка массива Python

1

У меня есть 2d-массив, A - 6x6. Я хотел бы взять первые 2 значения (индекс 0,0 и 0,1) и взять среднее из двух и вставить среднее значение в новый массив, который равен половине размера столбца A (6x3) с индексом 0,0, Тогда я бы получил следующие два индекса в A, усредняю ​​и помещал в новый массив в 0,1.

Единственный способ, которым я знаю, как это сделать, - использовать двойной цикл, но для производительности (я буду использовать массивы размером 3000х3000). Я знаю, что есть лучшее решение! Спасибо!

  • 0
    Если вы выполните эту операцию, не будет ли результат массивом (6x3)?
  • 0
    да, я понял это Спасибо!
Показать ещё 1 комментарий
Теги:
arrays
numpy
indexing
slice

2 ответа

10
Лучший ответ

Очень полезной особенностью массивов numpy является то, что они могут быть изменены и просмотрены по-разному, и тем самым вы можете сделать некоторые операции очень легкими.

Поскольку вы хотите соединить все два элемента, имеет смысл изменить массив 6x6 в массив 18x2:

import numpy as np

arr=np.arange(36).reshape(6,6)
print(arr)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]
#  [24 25 26 27 28 29]
#  [30 31 32 33 34 35]]
arr2=arr.reshape(-1,2)
print(arr2)
# [[ 0  1]
#  [ 2  3]
#  [ 4  5]
#  [ 6  7]
#  [ 8  9]
#  [10 11]
#  [12 13]
#  [14 15]
#  [16 17]
#  [18 19]
#  [20 21]
#  [22 23]
#  [24 25]
#  [26 27]
#  [28 29]
#  [30 31]
#  [32 33]
#  [34 35]]

Теперь усреднение легко:

means=arr2.mean(axis=1)
print(means)
# [  0.5   2.5   4.5   6.5   8.5  10.5  12.5  14.5  16.5  18.5  20.5  22.5
#   24.5  26.5  28.5  30.5  32.5  34.5]

И, наконец, мы просто изменим массив на 6x3:

means=means.reshape(6,-1)
print(means)
# [[  0.5   2.5   4.5]
#  [  6.5   8.5  10.5]
#  [ 12.5  14.5  16.5]
#  [ 18.5  20.5  22.5]
#  [ 24.5  26.5  28.5]
#  [ 30.5  32.5  34.5]]

или, как 1-лайнер:

means=arr.reshape(-1,2).mean(axis=1).reshape(6,-1)

PS: перестройка - очень быстрая операция, так как она возвращает представление, а не копию исходного массива. Все, что изменилось, это размеры и шаги. Остается только один вызов метода mean. Таким образом, это решение должно быть максимально быстрым, используя numpy.

  • 0
    Спасибо, это именно то, что я искал! Я буду смотреть больше на эти функции NumPy.
1

Я не думаю, что есть лучшее решение, если у вас нет дополнительной информации о том, что в этих массивах. Если это просто случайные числа, вам нужно сделать (n ^ 2)/2 вычисления, и ваш алгоритм отражает это, работая в O ((n ^ 2)/2).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню