В соответствии с «Есть только один очевидный способ сделать это», как вы можете получить величину вектора (массив 1D) в Numpy?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
Вышесказанное работает, но я не могу поверить, что должен сам определять такую тривиальную и основную функцию.
linalg.norm
как упомянуто ниже. Но немного проще, чем ваша лямбда-вещь, без необходимости импорта, простоsum(x*x)**0.5
def
при объявлении такой функции? Я думаю, что если это законно одна строка, это облегчает чтение.Ответы:
Функция вы после
numpy.linalg.norm
. (Я считаю, что это должно быть в базовой NumPy как свойство массива - скажемx.norm()
- ну да ладно).Вы также можете указать необязательную
ord
норму для n-го порядка. Скажем, вы хотели 1-норму:И так далее.
источник
Matrix.randn([5,5])
np.linalg.norm
теперь есть новыйaxis
аргумент, обсуждаемый здесь: stackoverflow.com/a/19794741/1959808Если вас беспокоит скорость, вместо этого вы должны использовать:
Вот несколько тестов:
РЕДАКТИРОВАТЬ: реальное улучшение скорости происходит, когда вы должны принять норму многих векторов. Использование чисто кодовых функций не требует циклов for. Например:
источник
np.linalg.norm
это узкое место, но затем я пошел на шаг дальше и просто использовал,math.sqrt(x[0]**2 + x[1]**2)
что стало еще одним значительным улучшением.numpy.linalg.norm
содержит гарантии от переполнения, которые пропускает эта реализация. Например, попробуйте вычислить норму[1e200, 1e200]
. Есть причина, если она медленнее ...inf
при вычисленияхnp.linalg.norm([1e200,1e200])
.Еще одна альтернатива - использовать
einsum
функцию в numpy для любого из массивов:или векторы:
Однако, похоже, что некоторые вызовы связаны с его вызовом, что может сделать его медленнее при небольших входных данных:
источник
numpy.linalg.norm
содержит гарантии от переполнения, которые пропускает эта реализация. Например, попробуйте вычислить норму[1e200, 1e200]
. Есть причина, если она медленнее ...Самый быстрый способ, который я нашел, это через inner1d. Вот как это можно сравнить с другими методами:
inner1d примерно в 3 раза быстрее, чем linalg.norm, и волосы быстрее, чем einsum
источник
linalg.norm
это самый быстрый, поскольку он делает 9 вызовов за 29 мс, поэтому 1 вызов за 3,222 мс против 1 вызова за 4,5 мс дляinner1d
.((10**8,3,))
затем запустите вручную,np.linalg.norm(V,axis=1)
после чегоnp.sqrt(inner1d(V,V))
вы заметите, чтоlinalg.norm
будет отставание по сравнению с inner1dnumpy.linalg.norm
содержит гарантии от переполнения, которые пропускает эта реализация. Например, попробуйте вычислить норму[1e200, 1e200]
. Есть причина, если она медленнее ...используйте функцию норма в scipy.linalg (или numpy.linalg )
источник
Вы можете сделать это кратко, используя toolbelt vg . Это легкий слой поверх numpy и он поддерживает отдельные значения и сложенные векторы.
Я создал библиотеку при моем последнем запуске, где она была мотивирована такими способами: простыми идеями, которые слишком многословны в NumPy.
источник