实际问题出现在某些机器学习应用程序中,数据有点复杂.所以这是一个能够捕捉问题本质的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]])