我有以下问题。有两个n维整数数组,我需要确定满足几个条件的项的索引。
假设我们有:
array1 = np.array([1,-1,-2])
array2 = np.array([0,1,1])
然后它应该返回索引2(第三个数字)。我正在尝试按如下方式编程:
import numpy as np
n = 3
array1 = np.array([1,-1,-2])
array2 = np.array([0,1,1])
indices = [i for i in range(n) if array1[i]<0]
indices2 = [i for i in indices if array2[i] == min(array2[indices])]
index = [i for i in indices2 if array1[i] == min(array1[indices2])][0] #[0] breaks the tie.
这似乎有效,但是,我发现它并不优雅。对我来说,似乎你应该能够在一行或两行中做到这一点并且定义更少的新变量。有人有改进的建议吗?提前谢谢。
答案 0 :(得分:3)
你可以从array1获取所有负面元素的索引:
np.where(array1 < 0)
然后您可以通过以下方式访问子集:
subset = array2[array1 < 0]
获取array1的最小(负)值的索引,可以使用array1.argmin()
value = array2[array1.argmin()]
把所有这些放在一起会给你:
value = array2[array1 < 0][array1[array1 < 0].argmin()]
但如果array1只有正值,则必须捕获ValueErrors。
答案 1 :(得分:2)
我不太了解numpy(虽然显然我应该真正研究它),所以这里是一个普通的python解决方案
此
sorted([(y, x, index) for (index, (x, y)) in enumerate(zip(array1, array2)) if x < 0])
将为您提供array2,array1中的三元素,在array2中按值排序的索引和在tie1的情况下在array1中的值,在tie的情况下为index
第一个要素是你寻求的。这给出了以下结果:
[(1, -2, 2), (1, -1, 1)]
因此索引为2,由[0][2]
答案 2 :(得分:2)
索引在“array1”中应该有一个负面元素:
indices_1 = np.argwhere(array1 < 0)
在带有负元素的子集中,它应该在“array2”中具有最小值。
indices_2 = array2[indices_1].argmin()
如果出现平局,请选择“array1”中值最小的值(否则为第一个值)
array1[indices_2].argmin()
答案 3 :(得分:1)
我想出了这个。刚刚设计了一个测试用例,似乎工作正常。看看它是否符合您的需求。
sorted([(array2[index], element, index) for index, element in enumerate(array1) if element<0])[0][2]
或者通过使用min
函数。
min([(array2[index], element, index) for index, element in enumerate(array1) if element<0])[2]
答案 4 :(得分:0)
以下内容适用于任何维度的numpy数组。 它使用numpy.lexsort来排序索引。
numpy.lexsort(Y,X)
按升序对X中的项目进行排序,并根据Y中的值断开关系。它按顺序返回索引(不是X
或Y
的值。 )这是我在numpy中所知道的唯一一个“打破关系”的功能。
import numpy as np
def find_index(array1, array2):
indices = np.where(array1 < 0)
i = np.lexsort((array1[indices],array2[indices]))[0]
return [idx[i] for idx in indices]
array1 = np.array([1,-1,-2])
array2 = np.array([0,1,1])
array3 = np.array([(1, 2),
(-1, -2),
(-2, 0)])
array4 = np.array([(0, 2),
(1, 1),
(3, 0)])
print(find_index(array1, array2))
# [2]
print(find_index(array3, array4))
# [1, 1]