我遇到这样的问题:
假设我有这样的数组:
'y',
'x',
'x',
'y',
'x',
'x',
'x'
我需要获取for (let i = 0; i < a.length; i++) {
console.log(a[i]);
for (let j = 0; j < z.length; j++) {
console.log(z[j], z[j+1]);
// break?
}
}
的索引,在该位置
a = np.array([[1,2,3,4,5,4,3,2,1],])
label = np.array([[1,0,1,0,0,1,1,0,1],])
的元素值为1,而a
的值是导致label
为1的最大值
在上面的示例中,a
为1的索引可能是:0、2、5、6、8,因此它们对应的label
的值为:1、3, 4、3、1,其中4是大数,因此我需要得到5的结果,它是label
中数字4的索引。我如何用numpy做到这一点?
答案 0 :(得分:3)
获取1s
索引,如idx
,然后用它索引到a
,获取max
索引,最后通过索引到{来追溯到原始顺序{1}}-
idx
样品运行-
idx = np.flatnonzero(label==1)
out = idx[a[idx].argmax()]
对于# Assuming inputs to be 1D
In [18]: a
Out[18]: array([1, 2, 3, 4, 5, 4, 3, 2, 1])
In [19]: label
Out[19]: array([1, 0, 1, 0, 0, 1, 1, 0, 1])
In [20]: idx = np.flatnonzero(label==1)
In [21]: idx[a[idx].argmax()]
Out[21]: 5
作为整数,a
作为label
和0s
的数组,我们可以进一步优化,因为我们可以根据范围缩放1s
其中的值,就像这样-
a
此外,如果(label*(a.max()-a.min()+1) + a).argmax()
仅具有正数,它将简化为-
a
正整数的时间(label*(a.max()+1) + a).argmax()
-
a
答案 1 :(得分:1)
您可以使用掩码数组:
>>> np.ma.masked_where(~label.astype(bool), a).argmax()
5
答案 2 :(得分:1)
这是最简单的方法之一。
>>> np.argmax(a * (label == 1))
5
>>> np.argmax(a * (label == 1), axis=1)
array([5])
Coldspeed的方法可能会花费更多时间。