【问题标题】:Changing the sign of the n elements closest to a value in a Numpy array更改最接近 Numpy 数组中某个值的 n 个元素的符号
【发布时间】:2019-04-03 10:37:32
【问题描述】:

我希望将 最接近 的 numpy 数组中的 n 个元素的符号更改为某个值,但不能更少。也就是说,元素必须等于或大于该值。是否有任何快速的 Numpy 方法可以有效地处理大型数组?

我现在拥有的代码采用 n 个更高或相等但不最接近的值,这是“好的”,但不适合我的结果。

def update(arr, n, value):
    updated = 0
    i = 0
    while updated < n:
        if arr[i] >= value: # just a random value above "value"
            arr[i] = -arr[i]
            updated +=1
        i += 1

arr = np.array([9, 8, 2, -4, 3, 4])
n = 3
value = 2
update(arr, n, value)

给我

arr = np.array([-9, -8, -2, -4, 3, 4])

当我想要的时候

arr = np.array([9, 8, -2, -4, -3, -4])

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你可以使用argpartition:

    arr = np.random.random(20)
    value = 0.5
    n = 4
    
    nl = np.count_nonzero(arr<value)
    closest = np.argpartition(arr, (nl, nl+n-1))[nl:nl+n]
    arr[closest] = -arr[closest]
    arr
    # array([ 0.33697627,  0.42607914, -0.63703314, -0.57517234,  0.82674228,
    #        -0.52929285,  0.64776714,  0.25609886,  0.24681445,  0.2486823 ,
    #         0.76740245,  0.02368603,  0.21498096, -0.51033841,  0.19901665,
    #         0.30939207,  0.69036139,  0.83178506,  0.97243443,  0.47620492])
    

    【讨论】:

      【解决方案2】:

      我没有更新数组,但我会做类似的事情:

      def update(arr, n, value):
          arr_copy = arr.copy()
          diffs = arr - value
          absolute_diffs = np.abs(diffs)
          update_indeces = np.argpartition(absolute_diffs, n)[:n]
          arr_copy[update_indeces] *= -1
          return arr_copy
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        def flip_some(a, n, value):
            more_than = (a >= value)
            first_n_elements = (a < np.sort(a[more_than])[n])
            return np.where(more_than & first_n_elements, -a, a)
        
        print(flip_some(np.array([9, 8, 2, -4, 3, 4]), 3, 2))
        print(flip_some(np.arange(10), 2, 5))
        

        输出:

        [ 9 -8  -2 -4 -3 -4]
        [ 0  1  2  3  4 -5 -6 -7  8  9]
        

        【讨论】:

          猜你喜欢
          • 2021-02-11
          • 1970-01-01
          • 1970-01-01
          • 2018-07-31
          • 1970-01-01
          • 2016-05-03
          • 1970-01-01
          • 2013-12-30
          • 2014-04-23
          相关资源
          最近更新 更多