对于一个排序的numpy数组中的每个元素,如何减去另一个排序的数组中的最小较大值

时间:2019-05-04 00:52:32

标签: python python-3.x numpy

假设我们有两个排序的numpy数组,git stash pusha

b

对于每个元素数组a = np.array([ 0, 1, 2, 10]) b = np.array([ 7, 13]) ,我想减去a中的第一个较大的元素以得到如下内容:

b

我可以使用效率低下的for循环来执行此操作,但是还有更多的numpythonic方式吗?

3 个答案:

答案 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])

如果您确实需要较大的最小,则可以预先使用bb = 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