Расстояние между массивами numpy по столбцам

I имеют 2 массива в 2D, где векторы-столбцы являются векторами признаков. Один массив имеет размер F x A, другой - F x B, где A << B. Например, для A = 2 и F = 3 (B может быть любым):

arr1 = np.array( [[1, 4],
                  [2, 5],
                  [3, 6]] )

arr2 = np.array( [[1, 4, 7, 10, ..],
                  [2, 5, 8, 11, ..],
                  [3, 6, 9, 12, ..]] )

Я хочу вычислить расстояние между arr1и фрагментом arr2равного размера (в данном случае 3x2) для каждого возможного фрагмента arr2. Векторы-столбцы не зависят друг от друга, поэтому я считаю, что должен вычислить расстояние между каждым вектором-столбцом в arr1и набором векторов-столбцов в диапазоне от iдо i + Aиз arr2и возьмите сумму этих расстояний (хотя и не уверен).

Предлагает ли numpy эффективный способ сделать это, или мне придется брать срезы из второго массива и, используя другой цикл, вычислять расстояние между каждым вектором-столбцом в arr1и соответствующим вектором-столбцом в срезе?

Пример для ясности с использованием массивов, указанных выше:

>>> magical_distance_func(arr1, arr2[:,:2])
[0, 10.3923..]
>>> # First, distance between arr2[:,:2] and arr1, which equals 0.
>>> # Second, distance between arr2[:,1:3] and arr1, which equals 
>>> diff = arr1 - np.array( [[4,7],[5,8],[6,9]] )
>>> diff
[[-3, -3], [-3, -3], [-3, -3]]
>>> # this happens to consist only of -3's. Norm of each column vector is:
>>> norm1 = np.linalg.norm([:,0])
>>> norm2 = np.linalg.norm([:,1])
>>> # would be extremely good if this worked for an arbitrary number of norms
>>> totaldist = norm1 + norm2
>>> totaldist
10.3923...

Конечно, транспонирование массивов тоже прекрасно, если это означает, что здесь можно как-то использовать cdist.

7
задан 19 June 2012 в 17:57
поделиться