У меня есть 2d-массив, A - 6x6. Я хотел бы взять первые 2 значения (индекс 0,0 и 0,1) и взять среднее из двух и вставить среднее значение в новый массив, который равен половине размера столбца A (6x3) с индексом 0,0, Тогда я бы получил следующие два индекса в A, усредняю и помещал в новый массив в 0,1.
Единственный способ, которым я знаю, как это сделать, - использовать двойной цикл, но для производительности (я буду использовать массивы размером 3000х3000). Я знаю, что есть лучшее решение! Спасибо!
Очень полезной особенностью массивов 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.
Я не думаю, что есть лучшее решение, если у вас нет дополнительной информации о том, что в этих массивах. Если это просто случайные числа, вам нужно сделать (n ^ 2)/2 вычисления, и ваш алгоритм отражает это, работая в O ((n ^ 2)/2).