2013-11-23 15 views
7

Używam Pythona 3 w Pyzo. Czy mógłbyś mi powiedzieć, dlaczego funkcja linalg.norm nie rozpoznaje argumentu osi.linalg.norm nie przyjmuje argumentu osi

ten kod:

c = np.array([[ 1, 2, 3],[-1, 1, 4]]) 
d=linalg.norm(c, axis=1) 

zwraca błąd:

TypeError: norm() got an unexpected keyword argument 'axis'

+4

Opcja 'axis' argument został dodany w wersji 1.8 numpy; patrz http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html. Jakiej wersji używasz? –

Odpowiedz

10

linalg.norm nie akceptuje axis argument. Można obejść to z:

np.apply_along_axis(np.linalg.norm, 1, c) 
# array([ 3.74165739, 4.24264069]) 

Albo być szybciej wdrożyć się z:

np.sqrt(np.einsum('ij,ij->i',c,c)) 
# array([ 3.74165739, 4.24264069]) 

Do czasu:

timeit np.apply_along_axis(np.linalg.norm, 1, c) 
10000 loops, best of 3: 170 µs per loop 

timeit np.sqrt(np.einsum('ij,ij->i',c,c)) 
100000 loops, best of 3: 10.7 µs per loop 
+0

Dziękuję. Twoja pierwsza sugestia jest dla mnie w porządku. –

4

Na numpy wersjach poniżej 1.8linalg.norm nie bierze axis argumentu można użyć np.apply_along_axis, aby uzyskać pożądany efekt, jak wskazano przez Warren Weckesser w komentarzu do pytania.

import numpy as np 
from numpy import linalg 

c = np.array([[ 1, 2, 3],[-1, 1, 4]]) 

d = np.apply_along_axis(linalg.norm, 1, c) 

Wynik:

>>> d 
array([ 3.74165739, 4.24264069]) 
+0

Dziękuję, działało zgodnie z oczekiwaniami. –

+0

Downvoter, czy możesz zostawić komentarz, dlaczego przegłosowałeś? – Akavall

+0

Nie wiem o downvoter, ale to działało dla mnie! Mała korekta: potrzebujesz np.linalg w powyższym przykładowym kodzie. Dziękuję szczególnie za komentarz na temat tego, że nie działa poniżej wersji 1.8. – GnomeDePlume

Powiązane problemy