2017-03-07 15 views
1

我在numpy的有一個數組,看起來像這樣:獲取字符串指數在一個數組

myarray = ['a', 'b', 'c', 'd', 'e', 'f'] 

我想回索引數組爲'b', 'c', 'd',看起來像這樣:

myind = [1,2,3] 

我需要這個索引數組以後在循環中使用它。我正在使用Python 2.7。感謝鄉親

回答

1

您可以使用np.searchsorted -

In [61]: myarray = np.array(['a', 'b', 'c', 'd', 'e', 'f']) 

In [62]: search = np.array(['b', 'c', 'd']) 

In [63]: np.searchsorted(myarray, search) 
Out[63]: array([1, 2, 3]) 

如果myarray不按字母順序排序,我們需要使用額外的參數sorter有了它,像這樣 -

In [64]: myarray = np.array(['a', 'd', 'b', 'e', 'c', 'f']) 

In [65]: search = np.array(['b', 'c', 'd']) 

In [67]: sidx = np.argsort(myarray) 

In [69]: sidx[np.searchsorted(myarray, search, sorter=sidx)] 
Out[69]: array([2, 4, 1]) 
+0

myarray中不排序,但琴絃的位置不應該改變。 – Bob

+1

@Bob那麼,基於'sorter'的應該工作? – Divakar

+1

@Bob此解決方案適合您嗎? – Divakar

1

如果陣列不不包含任何重複,然後np.searchsorted應該做的伎倆。如果你的數組包含重複,那麼你必須使用np.argwhere 例子:

input_array = np.array(['a','b','c','d','e','f','a']) 
search = np.array(['a','b','c']) 

np.searchsorted(input_array, search) 
output >> array([0, 1, 2]) 

np.argwhere(input_array == 'a') 
output >> array([[0],[6]]) 

對於一個更通用的解決方案,你可以做

np.concatenate((np.argwhere(input_array == 'a') , 
       np.argwhere(input_array == 'b'), 
       np.argwhere(input_array == 'c')) ) 
output >> array([[0],[6],[1],[2]]) 
+0

對於這種特殊情況,我沒有重複。但在其他情況下,我確實有重複。我感謝你的解決方案。謝謝。 – Bob

相關問題