2014-05-07 74 views
3

如何使用向量化numpy函數在2D數組的每一行中找到值的第一個索引?numpy:在2D數組的每一行中找到值的第一個索引

例如,給定

I = numpy.array([1,1,1] 
M = numpy.array([[1,2,3],[2,3,1],[3,1,2]]) 

輸出應該是:

array([0, 2, 1]) 

我可以用一個列表理解這樣做:

[ numpy.where(M[i] == I[i])[0][0] for i in range(0, len(I)) ] 

會是什麼numpy的等價是?

+0

索引您能發佈輸入數據和您期望的輸出的示例嗎?例如,'M = np.array([[1,2,3],[4,5,6]])''和'I = np.array([5,6,1])''。謝謝 – YXD

+0

增加了示例輸入和輸出。 –

回答

2

利用量化的可能性是如下

coords = ((I[:, np.newaxis] == M) * np.arange(M.shape[1], 0, -1)[np.newaxis, :]).argmax(1) 
any = (I[:, np.newaxis] == M).any(1) 
coords = coords[any] 

它歧義消除的權益的價值的幾次出現在之間通過將減法計數器與每行相乘,使第一次出現的值最高。如果給定的行不包含指示的值,則將其從coords中刪除。其餘行(找到相應的值)由any

1

我想這些可能一步做,一步:

In [52]: 

I = np.array([1,1,1]) 
#M = np.array([[1,2,3],[2,3,1],[3,1,2]]) 
M = np.array([[4,2,3],[2,3,4],[3,4,2]]) 
In [53]: 

I1=I.reshape((-1,1)) 
In [54]: 

M1=np.hstack((M, I1)) 
In [55]: 

np.apply_along_axis(np.argmax, 1, (M1-I1)==0) 
Out[55]: 
array([3, 3, 3]) 

如果M沒有找到多少,得到的索引M.shape[1]。由於結果是arrayint,因此在這些單元中放置nan不是一種選擇。但是,我們可以考慮把-1的情形外,如果結果是result

result[result==(M.shape[1])]=-1 
相關問題