python – 在numpy数组中的索引,其中slice在另一个数组中

实际问题出现在某些机器学习应用程序中,数据有点复杂.所以这是一个能够捕捉问题本质的MWE:

我有两个阵列如下:

L = np.arange(12).reshape(4,3)
M = np.arange(12).reshape(6,2)

现在,我想在L中找到行R,这样在M中存在一些由R中除了最后一个元素之外的所有元素组成的行.

从上面的示例代码中,L和M看起来像这样:

array([[ 0,  1,  2],  # L
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

array([[ 0,  1],  # M
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

我想从这些,L中标记的行,作为一个numpy数组:

array([[ 0,  1,  2],
       [ 6,  7,  8]])

如果我将L和M表示为python列表,我会这样做:

L = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
M = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11]]
answer = [R for R in L if R[:-1] in M]

现在,我知道我可以在numpy中使用类似的列表理解并将结果转换为数组,numpy就像它一样令人敬畏,可能有更优雅的方式来做我不知道的事情.

我试着查看np.where(获取所需的索引,然后我可以用它来接收L),但这似乎没有做我需要的.

我很感激任何帮助

最佳答案

>>> import hashlib
>>> fn = lambda xs: hashlib.sha1(xs).hexdigest()
>>> m = np.apply_along_axis(fn, 1, M)
>>> l = np.apply_along_axis(fn, 1, L[:,:-1])
>>> L[np.in1d(l, m)]
array([[0, 1, 2],
       [6, 7, 8]])
点赞