Python:在几种条件下查找数组的索引

时间:2013-05-16 14:59:16

标签: python conditional-statements indices

我有以下问题。有两个n维整数数组,我需要确定满足几个条件的项的索引。

  • 索引在“array1”中应该有一个负面元素。
  • 在具有负元素的子集中,它应该具有“array2”中的最小值。
  • 如果出现平局,请选择“array1”中值最小的值(否则为第一个)

假设我们有:

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.

这似乎有效,但是,我发现它并不优雅。对我来说,似乎你应该能够在一行或两行中做到这一点并且定义更少的新变量。有人有改进的建议吗?提前谢谢。

5 个答案:

答案 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中的值断开关系。它按顺序返回索引(不是XY的值。 )这是我在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]