2013-05-16 27 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]