Я написал код в Python, который отлично работает, но очень медленный; Я думаю, из-за циклов. Надеюсь, вы можете ускорить выполнение следующих операций с помощью команд numpy. Позвольте мне определить цель.numpy векторизация вместо циклов
Предположим, у меня есть двумерная матрицаразмеров row
x col
. Например, рассмотрите массив 6
x 11
(см. Рисунок ниже).
Я хочу, чтобы вычислить среднее значение для всех строк, то есть сумма ⱼ aᵢⱼ в результате чего в массиве. Это, конечно, можно легко сделать. (Я называю это значение
CM_tilde
)Теперь, для каждая строка Я хочу, чтобы вычислить среднее значение некоторых выбранных значений, а именно все значения ниже определенного порога, вычисляя их сумму и деления на количество всех столбцов (
N
). Если значение превышает указанный порог, добавляется значениеCM_tilde
(среднее значение для всей строки). Это значение называетсяCM
Затем величина
CM
вычитается из каждого элемента в строке
В дополнение к этому я хочу иметь Numpy массив или список, в котором все эти CM
значения перечислены ,
Фигура:
Следующий код работает, но очень медленно (особенно если массивы получать большие)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros((data.shape[0], data.shape[1], data.shape[2]))
all_CMs = np.zeros((data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
Есть идеи?
На шаге 2, вы по существу заменить любое значение, которое выше Treshold по CM_tilde, и *, то * вычислить среднее по всем подряд, в том числе замененных значений? – Evert
Начните с использования 'np.where', чтобы заменить внутренний цикл. Затем, используя трансляцию, вы можете удалить внешние 2 контура. См. Документацию для [где] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html) – mtadd