2013-05-16 65 views
1

我有以下问题。有两个整数的n维数组,我需要确定满足几个条件的项目的索引。Python:在几种情况下查找数组的索引

  • 索引在“array1”中应该有一个负数元素。
  • 对于具有负面元素的子集,它应该具有“array2”中的最小值。
  • 在平局的情况下,选择在“阵列1”的最小值(或第一其它)

价值因此,假设我们有:

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. 

这似乎工作,但是,我不觉得它非常优雅。对我来说,似乎你应该能够在一行或两行中完成此操作,并定义较少的新变量。任何人都有一个改进建议?提前致谢。

+1

您的阵列似乎是一维和大小n,而不是n维 – njzk2

+0

我通常使用条款矢量和阵列可以互换,这可能是错误的做法:)。我的意思是n维向量。 – Forzaa

回答

2

我不知道很多关于numpy的(虽然显然,我确实应该考虑它),所以这里是一个普通的Python解决方案

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

会给你从元素的tripley array2,array1,按array2中的值排序的索引和array1中的值在匹配的情况下,索引在匹配的情况下

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

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

指数因此是2,由[0][2]

+0

这对我来说几乎看起来很神奇!十分优雅。我不完全理解为什么这个工程还没有,但是,因为我还不是100%熟悉python。我会发现,虽然:) – Forzaa

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。

+0

是的,这是最接近我的,很容易理解。如果有负面因素,我只会执行这部分,顺便说一句,所以不要担心。 np.where函数非常有用...我还没有发现。非常感谢!我确实接受了其他答案,因为它更复杂。 – Forzaa

+0

切片用布尔掩模的阵列比np.where ARRAY1更快[ARRAY1 <0] 比 ARRAY1 [np.where(数组1 <0)] 所以尽量不使用NP快得多。在哪里,当你不想索引! – Hensing

+0

感谢您的提示,我会尽力记住。 – Forzaa

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] 
1

指数应该在“数组1”负元件:

indices_1 = np.argwhere(array1 < 0) 

该子集具有负元素中,它应该有在“数组2”的最小值。

indices_2 = array2[indices_1].argmin() 

在相同的情况下,选择具有在“ARRAY1”的最小值以下将与任何numpy的阵列工作的值(或所述第一其他方式)

array1[indices_2].argmin() 
+0

argmin()只为我返回一个元素...这就是为什么我没有使用它。 – Forzaa

0

尺寸。 它使用numpy.lexsort来排序索引。

numpy.lexsort(Y,X)根据Y.它返回订单指数值排序按升序X的项目,并打破关系(的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] 
相关问题