Средняя разница между двумя массивами - PullRequest
0 голосов
/ 20 мая 2018

У меня есть два одномерных массива NumPy X и Y.Мне нужно рассчитать среднюю абсолютную разницу между каждым элементом X и каждым элементом Y.Наивным способом является использование вложенного цикла for:

import numpy as np
np.random.seed(1)
X = np.random.randint(10, size=10)
Y = np.random.randint(10, size=10)

s = 0
for x in X:
    for y in Y:
        s += abs(x - y)
mean = s / (X.size * Y.size)
#3.4399999999999999

Вопрос: Предоставляет ли NumPy векторную, более быструю версию этого решения?

Отредактировано: Мне нужна средняя абсолютная разница (всегда неотрицательная).Извините за путаницу.

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Если вы размещаете плитки на противоположных осях, то вы можете abs дифференцировать как:

Код:

x = np.tile(X, (X.size, 1))
y = np.transpose(np.tile(Y, (Y.size, 1)))

mean_diff = np.sum(np.abs(x-y)) / (X.size * Y.size))

Код теста:

import numpy as np
X = np.random.randint(10, size=10)
Y = np.random.randint(10, size=10)

s = 0
for x in X:
    for y in Y:
        s += abs(x - y)
mean = s / (X.size * Y.size)
print(mean)

x = np.tile(X, (X.size, 1))
y = np.transpose(np.tile(Y, (Y.size, 1)))

print(np.sum(np.abs(x-y)) / (X.size * Y.size))

Результаты:

3.48
3.48
0 голосов
/ 20 мая 2018

Если я правильно понимаю, что ваше определение здесь, вы можете просто использовать трансляцию.

np.mean(np.abs(X[:, None] - Y))
0 голосов
/ 20 мая 2018

Один из способов:

diff = X - Y
abs_diff = np.abs(diff)
mean_diff = np.sum(abs_diff) / (X.size * Y.size)

Или более канонически:

np.mean(X - Y)

Чтобы взять абсолютную разницу:

np.mean(np.abs(X - Y))
...