как рассчитать евклидово расстояние между векторами двух INDArrays в ND4J?

Я пытаюсь рассчитать евклидово расстояние между двумя INDArray (предположим, что INDArray является альтернативой массиву numpy). В python я достиг этого как:

import numpy as np
from scipy.spatial.distance import cdist
arr1 = np.array(of some size)
arr2 = np.array(of some size)
ans = cdist(arr2 , arr1)

пример:

arr1 = [[20.73 62.67 ]   # each row is a vector. so arr1 has 3 2-Dimensional vectors
        [93.47 13.83]
        [50.01 16.60]]

arr2 = [[20.66  6.09]    # arr2 has 2 2-Dimensional vectors
        [51.79 85.14]]

ans =  [[56.57 73.21 31.17]   # distances of vectors of arr2 with arr1
        [38.33 82.59 68.55]]

Пожалуйста, помогите мне достичь этого в java. Я мало знаю о java. Пока что я пришел к выводу, что Nd4J может это сделать. Но я не знаю как.

ПРИМЕЧАНИЕ. вычисление евклидова числа с использованием for loops не требуется. На самом деле я пытаюсь увидеть влияние векторизации на производительность при расчете евклидова расстояния. Я узнал, что Nd4J поддерживает SIMD и векторизацию, как и Numpy. подробности


person Muhammad Ashfaq    schedule 26.04.2020    source источник


Ответы (1)


Transforms.euclideanDistance(a,b) для расстояния между тензорами одинаковой формы. Или что-то вроде этого для "случая вдоль измерения"

@Test
public void testEuclidean() {
    val arr1 = Nd4j.createFromArray(20.73, 62.67, 93.47, 13.83, 50.01, 16.60).reshape(3, 2);
    val arr2 = Nd4j.createFromArray(20.66, 6.09, 51.79, 85.14).reshape(2, 2);

    val result = Transforms.allEuclideanDistances(arr1, arr2, 1);
    log.info("Result: {}", result);
}

Изменить: добавлен пример кода для allEuclideanDistances.

person raver119    schedule 26.04.2020
comment
Transforms.allEuclideanDistances(a, b, axis) затем. - person raver119; 26.04.2020
comment
Я добавил в ответ пример для allEuclideanDistance(), он даст вам значения, аналогичные вашему скрипту Python, но в другом порядке. - person raver119; 26.04.2020
comment
это работает точно так же, как скрипт Python. arr2 задается перед arr1 в примере Python: Transforms.allEuclideanDistances(arr2, arr1, 1); - person Muhammad Ashfaq; 27.04.2020
comment
можем ли мы сделать это эффективным способом? Поскольку этот метод занимает еще больше времени, спасибо за использование обычных циклов for (что неинтуитивно). Nd4j должен был использовать векторизованный код C++ для всех числовых операций. - person Muhammad Ashfaq; 28.04.2020
comment
javadoc.io/static/org.nd4j/nd4j- api/1.0.0-beta5/org/nd4j/linalg/ будет ли это работать лучше? не знаю как это реализовать - person Muhammad Ashfaq; 29.04.2020