为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2019-11-02 13:41:02
我有一个较大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个字节的内存。如果您使用的是非常大的阵列,则此方法可能不可行。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 1009 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信