簡體   English   中英

從Numpy數組和float的元素中獲取最小值

[英]Getting the minimum from elements of a Numpy array and a float

問題:我想將Numpy數組的每個元素與浮點數進行比較,返回值較小的數組。 例如,使用輸入:

import numpy as np
input_a = 3
input_b = np.array([1,2,3,4,5])

輸出應該是

output = np.array([1,2,3,3,3])

我當前的解決方案是通過僅使用常量創建一個新的np.array,然后使用np.minimum()來工作。

c = np.copy(input_b)
c.fill(input_a)
output = np.minimum(input_b, c)

但是,恐怕這不是最有效的解決方案。 有沒有更優雅/更有效的方法來實現這一目標?

最好的選擇是使用邏輯索引。

import numpy as np
input_a = 3
input_b = np.array([1,2,3,4,5])

input_b[input_b > input_a] = input_a

print(input_b)
# [1 2 3 3 3]

input_b > input_a將返回True或False值的掩碼數組,在這種情況下,如果input_b的對應元素大於input_a則該元素為True。 然后,您可以使用它來索引input_b並僅修改那些值。

請注意,對於該特定數組,使用邏輯索引比使用numpy.where更快,盡管我無法確切告訴您原因。

setup = 'from __main__ import np, input_a, input_b'
print(timeit.timeit('input_b[input_b > input_a] = input_a', setup=setup)) 
# 2.2448947575996456
print(timeit.timeit('np.where(input_b < input_a, input_b, input_a)', setup=setup)) 
# 5.35540746395358

我認為np.minimum適合此操作:

>>> np.minimum(input_b, 3)
array([1, 2, 3, 3, 3])

如果要直接修改input_b ,請使用out關鍵字參數以成對的最小值填充input_b

>>> np.minimum(input_b, 3, out=input_b)
>>> input_b
array([1, 2, 3, 3, 3])

這比使用布爾索引然后分配值更快:

>>> %timeit input_b[input_b > input_a] = input_a
100000 loops, best of 3: 4.16 µs per loop

>>> %timeit np.minimum(input_b, 3, out=input_b)
100000 loops, best of 3: 2.53 µs per loop

一種方法是使用numpy.where

>>> np.where(input_b < input_a, input_b, input_a)
array([ 1.,  2.,  3.,  3.,  3.])

在這里,我們傳遞numpy.where三個參數,第一個是其中input_b < input_a的布爾數組。 每當第一個參數中的值為True ,我們將從第二個參數( input_b )的相應索引處獲取值。 否則,我們采用input_a的值。

編輯 :實際上,正如@Kasra的答案所示,您可以直接傳遞input_a而不將其轉換為np.array

您可以使用numpy.where

>>> np.where(input_b < input_a, input_b, input_a)
array([1, 2, 3, 3, 3])

有一個內置做到這一點: clip

output = input_b.clip(max=input_a)

或者如果您想設置input_b本身

np.clip(input_b, None, out=input_b)

在這里,它的作用與minimum相同,但在同一調用中也可以maximum 某些版本接受max關鍵字,而其他版本則不接受。

在我的時間安排中, clip的邊線要比minimum 但我建議您看哪一個意圖最明確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM