搜索numpy数组的模式

时间:2017-01-06 11:45:09

标签: python arrays numpy

我希望在给定搜索模式的情况下在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元素。

1 个答案:

答案 0 :(得分:1)

单一搜索模式

以下是broadcastingslicing -

的帮助下的一种方法
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])