numpy:在2D数组的每一行中查找值的第一个索引

numpy:在2D数组的每一行中查找值的第一个索引,numpy,Numpy,如何使用矢量化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的等价物是什么?我认为这些可以一步一步地做到: In [52]: I

如何使用矢量化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的等价物是什么?

我认为这些可以一步一步地做到:

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]
。由于结果是
int
数组
,因此在这些单元格中放置
nan
不是一个选项。但是,如果结果是<代码>结果< /代码>:

,我们可以考虑对这些情况提出“代码> -1”/代码>。
result[result==(M.shape[1])]=-1

利用矢量化的可能性如下所示

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

索引。您可以发布一个输入数据和预期输出的示例吗?例如,
M=np.array([[1,2,3],[4,5,6]])
I=np.array([5,6,1])
。感谢示例输入和输出。