如何检查一个二维NumPy数组内部是否包含特定的值模式?

我有一个较大NumPy.array field_array和较小的数组match_array,都由int值组成。使用下面的示例,如何检查是否有任何match_array形的段field_array包含与值完全对应的值match_array?


import numpy

raw_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]。


长风秋雁
浏览 1010回答 3
3回答

白猪掌柜的

NumPy中没有内置这样的搜索功能,但是在NumPy中当然可以做到只要您的数组不太庞大*,就可以使用滚动窗口方法:from skimage.util import view_as_windowswindows = 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个字节的内存。如果您使用的是非常大的阵列,则此方法可能不可行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python