我希望在给定搜索模式的情况下在numpy数组中找到一个值。例如,对于给定的数组a
,我想在使用搜索模式1
时检索s
的结果,因为1
是{{1}的索引0处的元素} {(a[:,1]
)和array([1, 0, 0, 1])
的元素匹配a[1:,1]
(即s
=>返回(a[1:,1] == s).all() == True
)。
另一个例子是a[0,1]
,我希望搜索结果为s=[1, 0, 1]
(在第4列开始时匹配(从1开始))。 2
也是2
等的搜索结果。
s=[2, 0, 0]
我提出了>>> import numpy as np
>>> a = np.asarray([[0, 1, 2, 2, 2, 2, 2, 2], [0, 0, 1, 1, 2, 2, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 1, 0, 1, 0, 1]])
>>> a
array([[0, 1, 2, 2, 2, 2, 2, 2],
[0, 0, 1, 1, 2, 2, 3, 3],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 1]])
>>> s = np.asarray([0, 0, 1])
,但我认为必须有更优雅的东西......
另外,如果我可以在多个搜索模式上进行一次调用来执行此操作,那将是很好的,这样我就可以检索索引1到索引3的值匹配的0元素。
答案 0 :(得分:1)
单一搜索模式
以下是broadcasting
和slicing
-
a[0,(a[1:] == s[:,None]).all(0)]
多种搜索模式
对于多种搜索模式(存储为2D数组),我们只需要像以前一样broadcast
并在最后查找ANY
匹配 -
a[0,((a[1:] == s[...,None]).all(1)).any(0)]
这是一个示例运行 -
In [327]: a
Out[327]:
array([[0, 1, 2, 2, 2, 2, 2, 2],
[0, 0, 1, 1, 2, 2, 3, 3],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 1]])
In [328]: s
Out[328]:
array([[1, 0, 1],
[2, 0, 0]])
In [329]: a[0,((a[1:] == s[...,None]).all(1)).any(0)]
Out[329]: array([2, 2])