Python 从Numpy数组和float的元素中获取最小值

Python 从Numpy数组和float的元素中获取最小值,python,arrays,numpy,min,Python,Arrays,Numpy,Min,问题:我想比较Numpy数组的每个元素和一个float,返回一个值较小的数组。例如,使用输入: 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() 然而,我恐怕这不是最有效的解决办法。有没有更优雅/高效的方法来实现这一点?我认为np。对于这个操作来说,最

问题:我想比较Numpy数组的每个元素和一个float,返回一个值较小的数组。例如,使用输入:

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


然而,我恐怕这不是最有效的解决办法。有没有更优雅/高效的方法来实现这一点?

我认为
np。对于这个操作来说,最小值是合适的:

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

我认为
np.最小值
适合此操作:

>>> 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
你最好的选择是使用

input\u b>input\u a
将返回一个包含真值或假值的掩码数组,在这种情况下,如果
input\u b
中的对应元素大于
input\u a
,则元素为真。然后,您可以使用它来索引
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
setup='from uuuuu main_uuuuu导入np,输入a,输入b'
打印(timeit.timeit('input_b[input_b>input_a]=input_a',setup=setup))
# 2.2448947575996456
打印(timeit.timeit('np.where(input_b
您的最佳选择是使用

input\u b>input\u a
将返回一个包含真值或假值的掩码数组,在这种情况下,如果
input\u b
中的对应元素大于
input\u a
,则元素为真。然后,您可以使用它来索引
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
setup='from uuuuu main_uuuuu导入np,输入a,输入b'
打印(timeit.timeit('input_b[input_b>input_a]=input_a',setup=setup))
# 2.2448947575996456
打印(timeit.timeit('np.where(input_b
这方面的一个内衬是:

>>>np.where(input_b
这里我们传递
numpy.where
三个参数,其中第一个参数是where
input\b
的布尔数组。只要第一个参数中的值为
True
,我们就从第二个参数(
input_b
)中获取相应索引处的值。否则,我们将取
input\u a
的值


编辑:事实上,正如@Kasra的回答所示,您可以直接传递
输入_a
,而无需将其转换为
np.数组

一行代码就可以使用:

>>>np.where(input_b
这里我们传递
numpy.where
三个参数,其中第一个参数是where
input\b
的布尔数组。只要第一个参数中的值为
True
,我们就从第二个参数(
input_b
)中获取相应索引处的值。否则,我们将取
input\u a
的值

编辑:事实上,正如@Kasra的回答所示,您可以直接传递
输入_a
,而无需将其转换为
np.array

,您可以使用:

>>>np.where(input_b
您可以使用:

>>>np.where(input_b
有一个内置的方法可以做到这一点:
clip

output = input_b.clip(max=input_a)
或者如果您想设置
输入\u b
本身

np.clip(input_b, None, out=input_b)
在这里,它的作用与
最小值
相同,但它也可以在同一个调用中执行
最大值
。一些版本接受
max
关键字,其他版本则不接受


clip
在我的计时中比
最小值有一定优势。但是我推荐哪一个在意图上看起来最清晰。

有一个内置的实现方法:
clip

output = input_b.clip(max=input_a)
或者如果您想设置
输入\u b
本身

np.clip(input_b, None, out=input_b)
在这里,它的作用与
最小值
相同,但它也可以在同一个调用中执行
最大值
。一些版本接受
max
关键字,其他版本则不接受

clip
在我的计时中比
最小值有一定优势。但我会推荐哪一个看起来意图最清晰