使用重复值循环numpy的排序值

使用重复值循环numpy的排序值,numpy,sorting,Numpy,Sorting,我有两个长度相同的数组: import numpy as np a = np.array([1,3,2,2,4]) b = np.array([1,2,3,4,5]) c = np.array([0.1,0.2,0.3,0.6,0.2]) 我想按升序对a排序,然后将b的位置与c中的位置相加,直到b的和大于16。例如,在第一次迭代中,我们将在a中找到1,它位于位置0。因此b[0]=b[0]+c[0]。然后因为np.sum(b)=15.1

我有两个长度相同的数组:

import numpy as np
a = np.array([1,3,2,2,4])
b = np.array([1,2,3,4,5])
c = np.array([0.1,0.2,0.3,0.6,0.2])
我想按升序对a排序,然后将b的位置与c中的位置相加,直到b的和大于16。例如,在第一次迭代中,我们将在a中找到1,它位于位置0。因此b[0]=b[0]+c[0]。然后因为np.sum(b)=15.1<16,所以迭代继续

这是我目前掌握的代码:

 n = 0
 while (np.sum(b) < 16) and (n < len(a)):
     min_a = np.partition(a, n)[n]
     if c[np.where(a==min_a)] < 16 - np.sum(b):
         b[np.where(a==min_a)] = b[np.where(a==min_a)]+c[np.where(a==min_a)]
     n = n + 1
n=0
而(np.sum(b)<16)和(n
我不知道我遗漏了什么,但最后一行替换似乎没有更新b中的值。此外,如果在以下情况中存在重复值,则代码将中断:

ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()


当存在重复的值时,我希望将它们作为其他值循环。换句话说,我们可以选择[2]优先或[3]优先,因为两者都是2。

如果我理解正确,您可以尝试以下方法:

import numpy as np
a = np.array([1,3,2,2,4])
b = np.array([1,2,3,4,5])
c = np.array([0.1,0.2,0.3,0.6,0.2])

a1 = np.astype('float')
b1 = np.astype('float')

indexes = np.argsort(a)

for idx in indexes:
  val = a1[idx]          # not sure if this value is used anywhere
  b1[idx] += c[idx]
  if np.sum(b1) > 16:
    break

>>> b1
array([1.1, 2.2, 3.3, 4.6, 5. ])
我认为您的更新没有反映的原因是您试图将浮点值添加到整型数组对象。

谢谢!解决方案(使用argsort)和解释(整型数组)都很棒!阵列b没有更新让我抓狂