78

NumPy có ba chức năng khác nhau mà có vẻ như họ có thể được sử dụng cho những điều tương tự --- ngoại trừ việc numpy.maximumcó thể chỉ được sử dụng yếu tố khôn ngoan, trong khi numpy.maxnumpy.amaxcó thể được sử dụng trên các trục cụ thể, hoặc tất cả các yếu tố này. Tại sao có nhiều hơn chỉ numpy.max? Có một số tinh tế cho điều này trong hiệu suất?

(Tương tự cho minso aminvới so với minimum)

|
99

np.maxchỉ là một bí danh cho np.amax. Hàm này chỉ hoạt động trên một mảng đầu vào duy nhất và tìm giá trị của phần tử tối đa trong toàn bộ mảng đó (trả về một vô hướng). Ngoài ra, nó cần một axisđối số và sẽ tìm giá trị tối đa dọc theo trục của mảng đầu vào (trả về một mảng mới).

>>> a = np.array([[0, 1, 6],
                  [2, 4, 1]])
>>> np.max(a)
6
>>> np.max(a, axis=0) # max of each column
array([2, 4, 6])

Hành vi mặc định của np.maximumlà lấy hai mảng và tính toán tối đa phần tử của chúng. Ở đây, 'tương thích' có nghĩa là một mảng có thể được phát sang mảng khác. Ví dụ:

>>> b = np.array([3, 6, 1])
>>> c = np.array([4, 2, 9])
>>> np.maximum(b, c)
array([4, 6, 9])

Nhưng np.maximumcũng là một chức năng phổ quát , có nghĩa là nó có các tính năng và phương thức khác hữu ích khi làm việc với các mảng đa chiều. Ví dụ: bạn có thể tính toán mức tối đa tích lũy trên một mảng (hoặc một trục cụ thể của mảng):

>>> d = np.array([2, 0, 3, -4, -2, 7, 9])
>>> np.maximum.accumulate(d)
array([2, 2, 3, 3, 3, 7, 9])

Điều này là không thể với np.max.

Bạn có thể np.maximumbắt chước np.maxở một mức độ nhất định khi sử dụng np.maximum.reduce:

>>> np.maximum.reduce(d)
9
>>> np.max(d)
9

Thử nghiệm cơ bản cho thấy hai cách tiếp cận có thể so sánh về hiệu suất; và họ nên, như np.max()thực sự kêu gọinp.maximum.reduce để thực hiện tính toán.

|
  • 1

    Cảm ơn. Rõ ràng người ta có thể sử dụng amaxcho cùng một mục đích (gốc) như maximum, tức là với numpy.amax([a1, a2], axis=0)--- nhưng điều này không được tối ưu hóa cho hành vi này như numpy.maximum? Tương tự như vậy, các niceties được thêm vào numpy.amax(ví dụ axistham số) có loại trừ nó ufunckhông?

    – Bùi Kim Châu 15:26:02 06/11/2015
  • 1

    Điều đó đúng, amaxkhông được tối ưu hóa để so sánh phần tử theo cách này - bất kỳ đầu vào nào cũng cần phải là một mảng Numpy, vì vậy danh sách đó sẽ được chuyển đổi trước khi hoạt động chạy (giả sử rằng hai hình dạng giống nhau). Các tài liệu amaxnói cụ thể maximumlà nhanh hơn ở đây.

    – Hoàng Tùy Anh 15:31:58 06/11/2015
  • 1

    Ở câu hỏi thứ hai: Tôi đoán amax có thể được tạo thành một ufunc, mặc dù mục đích chính của ufuncs là cho phép các hoạt động được phát giữa các mảng. Có vẻ như không cần phải thực hiện maxmột ufunc unary. Tôi nghĩ rằng amaxđã tồn tại trước khi ufuncs thực sự là một thứ (nó xuất phát từ số, cha mẹ của NumPy) nên cũng được giữ lại cho hậu thế.

    – Minh Tuấn 15:36:19 06/11/2015
  • 1

    Ở đây maximum.reduce được ưu tiên cho hiệu suất: The Python function max() will find the maximum over a one-dimensional array, but it will do so using a slower sequence interface. The reduce method of the maximum ufunc is much faster. Also, the max() method will not give answers you might expect for arrays with greater than one dimension.[...]

    – Hoàng Quang Tuấn 07:06:12 15/02/2019
  • 1

    @TomHale: Tôi nghĩ rằng tài liệu này đề cập đến hàm Python tích hợp sẵn max(), chứ không phải numpy.max(), nhưng chắc chắn chỉ ra rằng Python max()chậm hơn.

    – Lý Hạnh My 11:15:25 16/02/2019
15

Bạn đã nêu lý do tại sao np.maximumkhác nhau - nó trả về một mảng là mức tối đa theo phần tử giữa hai mảng.

Cả for np.amaxnp.max: cả hai đều gọi cùng một hàm - np.maxchỉ là một bí danh np.amaxvà chúng tính toán tối đa của tất cả các phần tử trong một mảng hoặc dọc theo trục của một mảng.

In [1]: import numpy as np

In [2]: np.amax
Out[2]: <function numpy.core.fromnumeric.amax>

In [3]: np.max
Out[3]: <function numpy.core.fromnumeric.amax>
|
  • 1

    Bây giờ tôi cảm thấy thật ngu ngốc, tôi đã làm from numpy import max as np_maxchỉ để tránh xung đột với cái chung maxmọi lúc trong khi tôi chỉ có thể sử dụng amax giấu .

    – Lý Mai Loan 11:53:57 31/08/2018
0

Để đầy đủ, trong Numpy có bốn chức năng liên quan tối đa . Chúng thuộc hai loại khác nhau:

  • np.amax/np.max, np.nanmax: cho thống kê đơn hàng mảng
  • np.maximum, np.fmaxđể so sánh phần tử khôn ngoan của hai mảng

I. Đối với thống kê đơn hàng mảng

Người tuyên truyền np.amax/np.maxNaN và đối tác không biết NaN của nó np.nanmax.

  • np.maxchỉ là một bí danh np.amax, vì vậy chúng được coi là một hàm.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxtuyên truyền NaN trong khi np.nanmaxbỏ qua NaN.

    >>> np.max([np.nan, 3.14, -1])
    nan
    >>> np.nanmax([np.nan, 3.14, -1])
    3.14

II. Để so sánh phần tử khôn ngoan của hai mảng

Người tuyên truyền NaN np.maximumvà đối tác không biết NaN của nó np.fmax.

  • Cả hai hàm đều yêu cầu hai mảng là hai đối số vị trí đầu tiên để so sánh với.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumtuyên truyền NaN trong khi np.fmaxbỏ qua NaN.

    >>> np.maximum([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
    array([ nan,  nan, 2.72])
    >>> np.fmax([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
    array([-inf, 3.14, 2.72])
  • Các hàm phần tử là np.ufunc( Hàm đa năng ) , có nghĩa là chúng có một số thuộc tính đặc biệt mà hàm Numpy bình thường không có.

    >>> type(np.maximum)
    <class 'numpy.ufunc'>
    >>> type(np.fmax)
    <class 'numpy.ufunc'>
    >>> #---------------#
    >>> type(np.max)
    <class 'function'>
    >>> type(np.nanmax)
    <class 'function'>

Và cuối cùng, các quy tắc tương tự áp dụng cho bốn chức năng tối thiểu liên quan:

  • np.amin/np.min, np.nanmin;
  • np.minimum, np.fmin.
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.