2013-11-23 62 views
7

Tôi đang sử dụng Python 3 trong Pyzo. Bạn có thể cho tôi biết tại sao hàm linalg.norm không nhận ra đối số trục.linalg.norm không lấy đối số trục

Mã này:

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

sẽ trả về lỗi:

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

+4

Lệnh 'axis' tranh luận đã được bổ sung trong phiên bản 1.8 của numpy; xem http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html. Phiên bản nào bạn đang sử dụng? –

Trả lời

10

linalg.norm không chấp nhận một cuộc tranh cãi axis. Bạn có thể khắc phục điều đó với:

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

Hoặc để được nhanh hơn, thực hiện nó cho mình với:

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

Đối với thời gian:

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

Cảm ơn bạn. Đề nghị đầu tiên của bạn là tốt cho tôi. –

4

On numpy phiên bản dưới đây 1.8linalg.norm không mất axis cãi nhau, bạn có thể sử dụng np.apply_along_axis có được kết quả mong muốn của bạn, như đã chỉ ra bởi Warren Weckesser trong phần bình luận cho câu hỏi.

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) 

Kết quả:

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

Cảm ơn bạn, điều này làm việc như mong muốn. –

+0

Downvoter, bạn có thể để lại một bình luận, là tại sao bạn downvoted? – Akavall

+0

Không biết về downvoter, nhưng điều này làm việc cho tôi! Chỉnh sửa nhỏ: bạn cần np.linalg trong mã ví dụ ở trên. Cảm ơn đặc biệt cho bình luận về nó không hoạt động dưới v1.8. – GnomeDePlume

Các vấn đề liên quan