我有一个较大NumPy.array field_array和较小的数组match_array,都由int值组成。使用下面的示例,如何检查是否有任何match_array形的段field_array包含与值完全对应的值match_array?import numpyraw_field = ( 24, 25, 26, 27, 28, 29, 30, 31, 23, \ 33, 34, 35, 36, 37, 38, 39, 40, 32, \ -39, -38, -37, -36, -35, -34, -33, -32, -40, \ -30, -29, -28, -27, -26, -25, -24, -23, -31, \ -21, -20, -19, -18, -17, -16, -15, -14, -22, \ -12, -11, -10, -9, -8, -7, -6, -5, -13, \ -3, -2, -1, 0, 1, 2, 3, 4, -4, \ 6, 7, 8, 4, 5, 6, 7, 13, 5, \ 15, 16, 17, 8, 9, 10, 11, 22, 14)field_array = numpy.array(raw_field, int).reshape(9,9)match_array = numpy.arange(12).reshape(3,4)这些示例应该返回,True因为所描述的模式match_array对齐[6:9,3:7]。
3 回答

白猪掌柜的
TA贡献1893条经验 获得超10个赞
NumPy中没有内置这样的搜索功能,但是在NumPy中当然可以做到
只要您的数组不太庞大*,就可以使用滚动窗口方法:
from skimage.util import view_as_windows
windows = view_as_windows(field_array, match_array.shape)
该函数view_as_windows纯粹是用NumPy编写的,因此如果您没有skimage,可以随时从这里复制代码。
然后查看子数组是否出现在较大的数组中,可以编写:
>>> (windows == match_array).all(axis=(2,3)).any()
True
要查找子数组左上角匹配的索引,可以编写:
>>> (windows == match_array).all(axis=(2,3)).nonzero()
(array([6]), array([3]))
这种方法也应适用于较大尺寸的阵列。
*尽管该数组不windows占用额外的内存(仅更改了步幅和形状以创建数据的新视图),但编写时windows == match_array会创建一个布尔数组,大小为(7,6,3,4),它是504个字节的内存。如果您使用的是非常大的阵列,则此方法可能不可行。
添加回答
举报
0/150
提交
取消