3

我有以下问题。有两个 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.

这似乎可行,但是,我觉得它不是很优雅。对我来说,您似乎应该能够在一两行中完成此操作,并且定义较少的新变量。有人有改进的建议吗?提前致谢。

4

5 回答 5

6

您可以从 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。

于 2013-05-16T15:08:26.077 回答
3

我对 numpy 不太了解(尽管显然我应该研究一下),所以这是一个简单的 python 解决方案

这个

sorted([(y, x, index) for (index, (x, y)) in enumerate(zip(array1, array2)) if x < 0])

将为您提供来自array2、array1、按array2中的值排序的索引和array1中的值在平局的情况下、在平局的情况下的索引的三元组

第一个元素是你所寻求的。这给出了以下结果:

[(1, -2, 2), (1, -1, 1)]

因此,该指数为 2,并通过以下方式获得[0][2]

于 2013-05-16T15:18:04.883 回答
2

索引应该在 "array1" 中有一个负元素

indices_1 = np.argwhere(array1 < 0)

在这个带有负元素的子集中,它应该在“array2”中具有最小值。

indices_2 = array2[indices_1].argmin()

如果出现平局,请选择“array1”中具有最小值的值(否则为第一个)

array1[indices_2].argmin()
于 2013-05-16T15:36:14.783 回答
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]
于 2013-05-16T15:27:09.097 回答
0

以下将适用于任何维度的 numpy 数组。它使用numpy.lexsort对索引进行排序。

numpy.lexsort(Y,X)按升序对 X 中的项目进行排序,并根据 Y 中的值打破关系。它按顺序返回索引(不是Xor的值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]
于 2013-05-16T15:36:46.947 回答