【发布时间】:2021-08-08 18:37:43
【问题描述】:
如何用较小的 2D numpy 数组替换大型 2D numpy 数组中的多个模式实例?
我正在寻找一个使用布尔掩码的矢量化解决方案,以尽量减少对性能的影响,因为我正在处理的大型数组将有数百万行长。
例如:
#Large array
largeArr = np.array([
[0, 1, 1],
[0, 1, 1],
[0, 1, 1],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 1, 1],
[0, 1, 1],
[0, 1, 1],
[0, 0, 0],
[0, 0, 0],
[3, 2, 0],
[3, 2, 0],
[3, 2, 0],
[3, 2, 0],
[0, 0, 0],
[0, 0, 0],
[3, 2, 0],
[3, 2, 0],
[3, 2, 0],
[3, 2, 0],
[0, 0, 0]
])
我想用包含 [0, 1, 1] 的连续 3 行替换部分
pattern1 = [
[0, 2, 1],
[0, 2, 2],
[0, 2, 3]
]
然后我想用包含[3, 2, 0]的连续4行替换部分
pattern2 = [
[5, 2, 1],
[5, 3, 2],
[5, 4, 3],
[5, 5, 4]
]
预期结果:
[[0, 2, 1],
[0, 2, 2],
[0, 2, 3],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 2, 1],
[0, 2, 2],
[0, 2, 3],
[0, 0, 0],
[0, 0, 0],
[5, 2, 1],
[5, 3, 2],
[5, 4, 3],
[5, 5, 4],
[0, 0, 0],
[0, 0, 0],
[5, 2, 1],
[5, 3, 2],
[5, 4, 3],
[5, 5, 4],
[0, 0, 0]]
将有多个模式要查找和替换,每个模式都有自己的替换数组。目的是一次循环遍历提供的搜索行和替换模式。
搜索行始终是单行,重复次数与替换模式中的行数一样多。
【问题讨论】:
-
您的大数组是否只包含三个一组的
[0,0,0]和[0,1,1]? -
不,它将包含整数的任意组合。该解决方案将用于替换循环内的多个模式
-
你能保证图案不重叠吗?
-
会有交替的模式,但我会循环遍历数组并替换整个数组中的每个模式
-
享受吧。我经常使用我在这里向您展示的方法。它看起来很长,但完全矢量化并且非常快。一个包含 1100 万行和 6 个替换模式的数组在我的机器上运行了
标签: python numpy multidimensional-array vectorization masking