2015-03-18 16 views
8

Một vài ví dụ:Tại sao numpy có một hàm tương ứng cho nhiều phương thức ndarray?

numpy.sum() 
ndarray.sum() 
numpy.amax() 
ndarray.max() 
numpy.dot() 
ndarray.dot() 

... và một vài chi tiết khác. Là nó để hỗ trợ một số mã di sản, hoặc là có một lý do tốt hơn cho điều đó? Và, tôi chỉ chọn trên cơ sở mã của tôi 'trông' như thế nào, hay là một trong hai cách tốt hơn cái kia?

tôi có thể tưởng tượng rằng người ta có thể muốn sử dụng numpy.dot()reduce (ví dụ, reduce(numpy.dot, A, B, C, D)) nhưng tôi không nghĩ rằng đó sẽ là hữu ích cho một cái gì đó giống như numpy.sum().

+0

Trong hầu hết các trường hợp, các phiên bản chức năng kết thúc lên gọi phiên bản phương pháp (ràng buộc với lập luận 1). Nhưng hàm có thể có 'doc' dài hơn. Đối với người dùng, nó chủ yếu là vấn đề về phong cách. – hpaulj

+2

Xem thêm vấn đề này: https://github.com/numpy/numpy/issues/7452. Có vẻ như các nhà phát triển vất vả muốn loại bỏ cú pháp phương pháp, nhưng không thể do nhu cầu duy trì khả năng tương thích ngược. Cá nhân tôi thích nó chỉ được thực hiện phù hợp để tất cả các chức năng có thể được gọi là phương pháp hơn là một vài lựa chọn. – Peter

Trả lời

6

Như những người khác đã lưu ý, các chức năng NumPy hệt tên và phương pháp mảng thường tương đương (họ kết thúc gọi mã cơ bản giống nhau). Người ta có thể được ưa thích hơn người kia nếu nó làm cho việc đọc dễ dàng hơn.

Tuy nhiên, trong một số trường hợp hai cư xử khác nhau đôi chút khác nhau. Cụ thể, sử dụng phương pháp ndarray đôi khi nhấn mạnh thực tế là phương pháp đang sửa đổi mảng tại chỗ.

Ví dụ: np.resize trả về một mảng mới có hình dạng được chỉ định. Mặt khác, ndarray.resize thay đổi hình dạng của mảng tại chỗ. Các giá trị điền được sử dụng trong mỗi trường hợp cũng khác nhau.

Tương tự, a.sort() sắp xếp mảng a tại chỗ, trong khi np.sort(a) trả về bản sao đã sắp xếp.

+0

Mhhh ... Không chắc chắn về 'np.resize' so với' ndarray.resize', cả hai dường như đều hoạt động. Tôi chỉ cố gắng và nếu tôi làm một cái gì đó như 'C = np.reshape (A, (1,5))', sau đó 'C [0,3] = 100' tôi thấy rằng cũng' A' đã thay đổi. (Tôi đang dùng python 3.4, numpy 1.9.2.) – Roberto

+0

@Roberto: Bạn đang sử dụng 'resize' hay' reshape'? Chúng hoàn toàn khác nhau - 'ndarray.rehsape' và' np.reshape' đều trả về một khung nhìn mới của một mảng. 'resize' có thể điều chỉnh kích thước thực của một mảng trong bộ nhớ, phân bổ nhiều hơn nếu cần. –

+0

Ôi trời là một trong những ngày đó. :) Vâng, tôi không biết tại sao tôi lại trộn lẫn cả hai. Có lẽ vì cả hai đều bắt đầu bằng 're'. – Roberto

4

Trong hầu hết các trường hợp phương pháp này là phiên bản được biên soạn cơ bản. Hàm này sử dụng phương thức đó khi có sẵn, nhưng cũng có một số loại sao lưu khi đối số không phải là một mảng. Nó giúp xem mã và/hoặc tài liệu của hàm hoặc phương thức.

Ví dụ nếu trong Ipython Tôi hỏi để xem xét các mã cho các phương pháp tổng hợp, tôi thấy rằng nó được biên dịch mã

In [711]: x.sum?? 
Type:  builtin_function_or_method 
String form: <built-in method sum of numpy.ndarray object at 0xac1bce0> 
... 
Refer to `numpy.sum` for full documentation. 

Làm tương tự trên np.sum tôi nhận được nhiều dòng tài liệu cộng với một số mã Python :

if isinstance(a, _gentype): 
     res = _sum_(a) 
     if out is not None: 
      out[...] = res 
      return out 
     return res 
    elif type(a) is not mu.ndarray: 
     try: 
      sum = a.sum 
     except AttributeError: 
      return _methods._sum(a, axis=axis, dtype=dtype, 
           out=out, keepdims=keepdims) 
     # NOTE: Dropping the keepdims parameters here... 
     return sum(axis=axis, dtype=dtype, out=out) 
    else: 
     return _methods._sum(a, axis=axis, dtype=dtype, 
          out=out, keepdims=keepdims) 

Nếu tôi gọi np.sum(x) nơi x là một mảng, nó kết thúc lên gọi x.sum():

sum = a.sum 
    return sum(axis=axis, dtype=dtype, out=out) 

np.amax tương tự (nhưng đơn giản hơn). Lưu ý rằng biểu mẫu np. có thể xử lý một đối tượng không phải là một mảng (không có phương thức), ví dụ: một danh sách: np.amax([1,2,3]).

np.dotx.dot cả hai đều hiển thị dưới dạng chức năng 'được tích hợp sẵn', vì vậy chúng tôi không thể nói gì về mức độ ưu tiên. Họ có thể cả hai kết thúc lên gọi một số chức năng C cơ bản.

np.reshape là khác mà deligates nếu có thể:

try: 
    reshape = a.reshape 
except AttributeError: 
    return _wrapit(a, 'reshape', newshape, order=order) 
return reshape(newshape, order=order) 

Vì vậy np.reshape(x,(2,3)) là giống hệt nhau trong chức năng để x.reshape((2,3)). Nhưng biểu thức _wrapit cho phép np.reshape([1,2,3,4],(2,2)).

np.sort trả về một bản sao bằng cách làm một loại inplace trên một bản sao:

a = asanyarray(a).copy() 
a.sort(axis, kind, order) 
return a 

x.resize là built-in, trong khi np.resize kết thúc lên làm một np.concatenatereshape.

Nếu mảng của bạn là một phân lớp, như ma trận hoặc mặt nạ, nó có thể có biến thể riêng của nó. Các hành động của một ma trận .sum là:

return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis) 
+1

TIL về '?? 'trong ipython – acushner

+0

Trong' Ipython','? 'Có nghĩa là hiển thị tài liệu,' ?? 'chỉ cho tôi mã. Đó là một công cụ hữu ích cho sự mâu thuẫn mã. Và '. 'liệt kê các lần hoàn thành có thể có. – hpaulj

+0

Cảm ơn, '??' thực sự rất hữu ích! – Roberto

0

Xây dựng trên bình luận Phêrô cho visibility:

Chúng ta có thể làm cho nó phù hợp hơn bằng cách loại bỏ các phương pháp từ ndarray và gắn bó với chỉ chức năng. Nhưng điều này là không thể vì nó sẽ phá vỡ mã hiện tại của mọi người sử dụng các phương thức.

Hoặc, chúng tôi có thể di chuyển tất cả các hàm cũng là các phương thức. Nhưng điều này là không thể bởi vì người dùng mới và các gói liên tục định nghĩa các chức năng mới. Plus tiếp tục nhân các phương pháp trùng lặp vi phạm "có nên có một cách rõ ràng để làm điều đó".

Nếu chúng tôi có thể quay ngược thời gian thì có lẽ tôi sẽ tranh luận vì không có các phương pháp này trên ndarray và sử dụng các chức năng độc quyền. ... Vì vậy, đây tất cả các lập luận cho việc sử dụng các chức năng dành riêng

numpy issue: More consistency with array-methods #7452

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