2013-11-23 6 views
7

Я использую Python 3 в Pyzo. Пожалуйста, не могли бы вы рассказать мне, почему функция linalg.norm не распознает аргумент оси.linalg.norm не принимает аргумент оси

Этот код:

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

возвращает ошибку:

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

+4

Параметр 'axis' аргумент был добавлен в версии 1.8 of numpy; см. http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html. Какую версию ты используешь? –

ответ

10

linalg.norm не принимает axis аргумент. Вы можете обойти это с:

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

Или быть быстрее, реализовать его самостоятельно с:

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

Для времени:

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

Спасибо. Ваше первое предложение подходит для меня. –

4

На numpy версии ниже 1.8linalg.norm не принимает axis аргумента, вы можете использовать np.apply_along_axis, чтобы получить желаемый результат, как указывалось Уоррен Уокессер в комментарии к вопросу.

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) 

Результат:

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

Спасибо, это сработало по желанию. –

+0

Downvoter, можете ли вы оставить комментарий, почему вы отказались? – Akavall

+0

Не знаю, что такое downvoter, но это сработало для меня! Небольшая коррекция: вам нужно np.linalg в приведенном выше примере кода. Спасибо, особенно за комментарий о том, что он не работает ниже v1.8. – GnomeDePlume

Смежные вопросы