![](/img/trans.png)
[英]Convert elements in array of objects from int to float python numpy
[英]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.