Вы не правильно звоните np.vectorize()
. Я предлагаю обратиться к документации .
Vectorize принимает в качестве аргумента функцию , написанную для работы с скалярными значениями, и преобразует ее в функцию, которую можно векторизовать над значениями в массивах в соответствии с Numpy правилами вещания. В основном это похоже на причудливый map()
для Numpy массива.
, т. Е. Как вы знаете, Numpy уже имеет встроенные векторизованные версии многих общих функций, но если у вас есть какая-то пользовательская функция, например "my_special_function ( x) "и вы хотели иметь возможность вызывать его для Numpy массивов, вы могли бы использовать my_special_function_ufunc = np.vectorize(my_special_function)
.
В приведенном выше примере вы могли бы" векторизовать "вашу функцию расстояния, например:
>>> norm = np.linalg.norm
>>> get_distance4 = np.vectorize(lambda a, b: norm(a - b))
>>> get_distance4(coordinates[:, None, :], coordinates[None, :, :])
Однако вы обнаружите, что это невероятно медленно:
>>> %timeit get_distance4(coordinates[:, None, :], coordinates[None, :, :])
1 loop, best of 3: 10.8 s per loop
Это потому, что ваш первый пример get_distance3
уже использует встроенные в Numpy быстрые реализации этих операций, в то время как версия np.vectorize
требует вызова функции Python, которую я определил около 3000 раз.
Фактически в соответствии с документацией:
Функция векторизации предоставляется в основном для удобства, не для производительности. Реализация, по сути, для l oop.
Если вам нужна потенциально более быстрая функция для преобразования расстояний между векторами, вы можете использовать scipy.spacial.distance.pdist
:
>>> %timeit get_distances3(coordinates)
10 loops, best of 3: 24.2 ms per loop
>>> %timeit distance.pdist(coordinates)
1000 loops, best of 3: 1.77 ms per loop
Стоит отметить, что это имеет другую форму возврата. Вместо массива 1000x1000 он использует сжатый формат, который исключает записи i = j
и записи i > j
. Если вы используете sh, вы можете использовать scipy.spatial.distance.squareform
для преобразования обратно в квадратный матричный формат.