В настоящее время я изучаю вещание в Numpy и в книге, которую читаю (Python for Data Analysis by Wes McKinney автор упомянул следующий пример, чтобы "унизить" двумерный массив:
import numpy as np
arr = np.random.randn(4, 3)
print(arr.mean(0))
demeaned = arr - arr.mean(0)
print(demeaned)
print(demeand.mean(0))
Что фактически приводит к тому, что массив demeaned
имеет среднее значение 0.
У меня возникла идея применить это к трехмерному массиву, похожему на изображение:
import numpy as np
arr = np.random.randint(0, 256, (400,400,3))
demeaned = arr - arr.mean(2)
Что, конечно же, не удалось, потому что, согласно правилу вещания, конечные размеры должны совпадать, а здесь это не так:
print(arr.shape) # (400, 400, 3)
print(arr.mean(2).shape) # (400, 400)
Теперь я заставил его работать в основном, вычитая среднее значение из каждого отдельного индекса в третьем измерении массива:
demeaned = np.ones(arr.shape)
for i in range(3):
demeaned[...,i] = arr[...,i] - means
print(demeaned.mean(0))
На данный момент возвращаемые значения очень близки к нулю, и я думаю, что это ошибка точности. Я действительно прав с этой мыслью или есть еще одна оговорка, которую я пропустил?
Кроме того, это не кажется самым чистым, самым «numpy
» способом достичь того, чего я хотел достичь. Есть ли функция или принцип, который я могу использовать для улучшения кода?
x.mean(2)
— это массивы 400x400 средних значений для каждого пикселя. Вместо этого вы хотели получить 3-элементное среднее для каждой плоскости изображения? - person Mad Physicist   schedule 28.11.2019arr.mean(2)[:, :, np.newaxis]
для создания соответствующей формы. See Try it online ! - person 301_Moved_Permanently   schedule 28.11.2019np.mean
сkeepdims=True
. - person Tim Hilt   schedule 28.11.2019