假设我们有两个排序的numpy数组,git stash push
和a
。
b
对于每个元素数组a = np.array([ 0, 1, 2, 10])
b = np.array([ 7, 13])
,我想减去a
中的第一个较大的元素以得到如下内容:
b
我可以使用效率低下的for循环来执行此操作,但是还有更多的numpythonic方式吗?
答案 0 :(得分:4)
您可以为此使用searchsorted
。它将要求对b
进行排序,并且a
的值不得大于b
中的最大值。
> a = np.array([0, 1, 2, 10, 12, 5, 7])
> b = np.array([7, 13])
> a - b[np.searchsorted(b, a, side='right')]
array([-7, -6, -5, -3, -1, -2, -6])
答案 1 :(得分:0)
标题和解释不一致。
假设您要查找b
的 first 元素,而不是b
的最小元素,然后这样做:
a - b[np.argmax(a[:,None]<b,axis=1)]
# array([-7, -6, -5, -3])
如果您确实需要较大的最小,则可以预先使用b
对b = np.sort(b)
进行排序,但随后可以按照Mark Meyer的建议使用searchsorted()进行排序更有效率。
请注意,b
中必须至少有一个元素大于a
答案 2 :(得分:-1)
即使该解决方案不是内置函数,也应尝试使用它,因为它更加灵活。 (在所有情况下均可使用):
def subtract(a, b):
final = []
if b.__len__() != 0 and a.__len__() != 0:
biggest = b[0]
for j in range(b.__len__()):
if b[j] < biggest:
biggest = b[j]
print(b[j])
print(biggest)
for i in range(a.__len__()):
if a[i] > biggest:
final.insert(final.__len__(), biggest-a[i])
else:
final.insert(final.__len__(), a[i]-biggest)
return final