De acordo com o "Existe apenas uma maneira óbvia de fazer isso", como você obtém a magnitude de um vetor (matriz 1D) em Numpy?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
O exposto acima funciona, mas não acredito que devo especificar uma função tão trivial e essencial.
linalg.norm
como mencionado abaixo. Mas um pouco mais simples do que a sua coisa lambda, sem importações necessárias, é apenassum(x*x)**0.5
def
ao declarar uma função como essa? Eu acho que se é legitimamente uma linha, facilita a leitura.Respostas:
A função que você procura é
numpy.linalg.norm
. (Eu acho que deve estar na base numpy como uma propriedade de uma matriz - digamosx.norm()
- mas tudo bem).Você também pode alimentar um opcional
ord
para a norma de enésima ordem que desejar. Digamos que você queira a 1 norma:E assim por diante.
fonte
Matrix.randn([5,5])
np.linalg.norm
agora tem um novoaxis
argumento, discutido aqui: stackoverflow.com/a/19794741/1959808Se você está preocupado com a velocidade, use:
Aqui estão alguns benchmarks:
EDIT: A melhoria real da velocidade ocorre quando você precisa seguir a norma de muitos vetores. O uso de funções numpy puras não requer loops. Por exemplo:
fonte
np.linalg.norm
era um gargalo, mas depois fui um passo adiante e apenas o usei, omath.sqrt(x[0]**2 + x[1]**2)
que foi outra melhoria significativa.numpy.linalg.norm
contém salvaguardas contra o estouro que esta implementação ignora. Por exemplo, tente calcular a norma de[1e200, 1e200]
. Há uma razão para que seja mais lenta ...inf
ao computarnp.linalg.norm([1e200,1e200])
.Ainda outra alternativa é usar a
einsum
função numpy para qualquer uma das matrizes:ou vetores:
No entanto, parece haver alguma sobrecarga associada à chamada que pode torná-lo mais lento com pequenas entradas:
fonte
numpy.linalg.norm
contém salvaguardas contra o estouro que esta implementação ignora. Por exemplo, tente calcular a norma de[1e200, 1e200]
. Há uma razão para que seja mais lenta ...A maneira mais rápida que encontrei é via inner1d. Veja como ele se compara a outros métodos numpy:
inner1d é ~ 3x mais rápido que linalg.norm e um cabelo mais rápido que einsum
fonte
linalg.norm
é o mais rápido, pois realiza 9 chamadas em 29ms; portanto, 1 chamada em 3,222ms vs. 1 chamada em 4,5msinner1d
.((10**8,3,))
e, em seguida, executar manualmentenp.linalg.norm(V,axis=1)
seguido pornp.sqrt(inner1d(V,V))
, você notarálinalg.norm
vai ficar em comparação com inner1dnumpy.linalg.norm
contém salvaguardas contra o estouro que esta implementação ignora. Por exemplo, tente calcular a norma de[1e200, 1e200]
. Há uma razão para que seja mais lenta ...use a norma de função em scipy.linalg (ou numpy.linalg )
fonte
Você pode fazer isso de forma concisa usando o cinto de ferramentas vg . É uma camada leve em cima de numpy e suporta valores únicos e vetores empilhados.
Criei a biblioteca na minha última inicialização, onde foi motivada por usos como este: idéias simples que são muito detalhadas no NumPy.
fonte