numpy max vs amax vs max


132

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 minimum)

Câu trả lời:


164

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ự, các niceties được thêm vào numpy.amax(ví dụ: axistham số) có loại trừ nó ufunckhông?
DilithiumMatrix

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, do đó 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.
Alex Riley

Ở 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ế.
Alex Riley

Ở đâ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.[...]
Tom Hale

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.
Alex Riley

21

Bạn đã nêu lý do tại sao np.maximumkhác nhau - nó trả về một mảng tối đa theo yếu 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>

2
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 .
Bas Jansen

8

Để đầy đủ, trong Numpy có bốn chức năng liên quan tối đa . Họ 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à bí danh của chúng 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.

0

np.maximum không chỉ so sánh từng phần tử mà còn so sánh từng phần tử với giá trị đơn

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.