Сумма Квадратных Различий (SSD) в numpy/scipy

также, длинный метод - это было последнее средство после попытки всех элементов выше:

c:\python27\scripts\pip.exe install [package].whl

это после cd в каталоге, где находится колесо

8
задан Internet man 17 February 2010 в 11:43
поделиться

5 ответов

Всего

s = numpy.sum((A[:,:,0:3]-B[:,:,0:3])**2)

(что, как я ожидаю, скорее всего, будет просто сумма ((AB) ** 2) , если форма всегда ( , , 3))

Вы также можете использовать метод суммы: ((AB) ** 2) .sum ()

Верно?

36
ответ дан 5 December 2019 в 05:03
поделиться

Только, чтобы упомянуть, что можно также использовать np.dot :

def ssd(A,B):
  dif = A.ravel() - B.ravel()
  return np.dot( dif, dif )

Это могло бы быть немного быстрее и возможно более точным, чем альтернативы с помощью np.sum и **2, но не работает, если Вы хотите вычислить ssd вдоль указанной оси. В этом случае могла бы быть волшебная нижняя формула с помощью np.einsum .

0
ответ дан 5 December 2019 в 05:03
поделиться

Я не знаю, будет ли функция pow () с 2 питания быстрой. Попробуйте:

def ssd(A,B):
    s = 0
    for i in  range(3):
        s += sum((A[:,:,i] - B[:,:,i])*A[:,:,i] - B[:,:,i])
    return s
-121--3442056-

Мое правило: если многие записи будут использовать это значение по умолчанию (по крайней мере, изначально), то мне нравится использовать его как значение по умолчанию. Например, таблица изображений для продуктов в интернет-магазине может иметь путь по умолчанию images/NoPicureYet.png . В конце концов, они будут заменены, но для пакетной загрузки данных, где картины просто еще не существуют (и, может быть, большинство из них никогда не будет!), по умолчанию имеет смысл (для меня, по крайней мере).

Если нет разумного значения по умолчанию (например, «имя» в базе данных клиента - я не хочу, чтобы МОЕ имя по умолчанию было «FirstName»), то я делаю его не имеющим значения NULL и не имеющим значения по умолчанию - приложение обязано обеспечить ввод правильного значения.

Но никаких жестких и быстрых правил по этому поводу. Все немного варьируется;)

-121--2439266-

Я путаю, почему вы принимаете i в диапазоне (3) . Это должен быть весь массив, или просто часть?

В целом, вы можете заменить большинство из них операциями, определенными в numpy:

def ssd(A,B):
    squares = (A[:,:,:3] - B[:,:,:3]) ** 2
    return numpy.sum(squares)

Это путь вы можете сделать одну операцию вместо трех и с помощью numpy.sum можете оптимизировать добавление лучше, чем builtin sum .

1
ответ дан 5 December 2019 в 05:03
поделиться

Я не знаю, будет ли функция pow() с мощностью 2 быстрой. Попробуйте:

def ssd(A,B):
    s = 0
    for i in  range(3):
        s += sum((A[:,:,i] - B[:,:,i])*A[:,:,i] - B[:,:,i])
    return s
1
ответ дан 5 December 2019 в 05:03
поделиться

В дополнение к ответу Рицарт Хорнстра, который получил 2 отрицательные оценки (по общему признанию, я не видел его в исходной форме ...)

Это действительно так.

При большом количестве итераций для использования оператора '**' или метода pow (x, y) часто может потребоваться в два раза больше времени, чем для простого умножения пар вручную. При необходимости используйте метод math.fabs (), если он выбрасывает NaN (что иногда случается, особенно при использовании int16s и т. Д.), И он по-прежнему занимает примерно половину времени, чем две указанные функции.

Я знаю, что это не так важно для исходного вопроса, но определенно стоит знать.

1
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: