我在 NumPy 中有两个矩阵。一个比另一个大。我想将较小的二维数组(随机)插入较大的二维数组,其中只有零(因此较大数组中的实际信息不会丢失)。示例:
大数组:
[0 0 0 9]
[0 0 0 7]
[0 0 0 2]
[2 3 1 5]
小数组:
[3 3]
[3 3]
(可能的)结果:
[3 3 0 9]
[3 3 0 7]
[0 0 0 2]
[2 3 1 5]
我认为您可以使用二维卷积来找到小数组 b
可以进入大数组 a
的位置。如果您将 scipy.signal.convolve2d
与 mode='valid'
一起使用,您只会获得小数组“适合”的位置。我认为使用数组的 abs
可以绕过正值和负值(在任一数组中)取消,但我还没有非常严格地测试过这些。
这是我所做的,使用@CypherX 的fill_a_with_b
函数进行填充步骤:
import numpy as np
import scipy.signal
# Your input data.
a = np.array([[0, 0, 0, 9],
[0, 0, 0, 7],
[0, 0, 0, 2],
[2, 3, 1, 5]])
b = np.ones((2, 2)) * 3
# Find places where b can go.
allowed = scipy.signal.convolve2d(np.abs(a), np.abs(b), mode='valid')
# Get these locations as (row, col) pairs.
coords = np.stack(np.where(allowed==0)).T
# Choose one of the locations at random.
choice = coords[np.random.randint(coords.shape[0])]
# Use @CypherX's 'fill' function.
def fill_a_with_b(a, b, pos=[0, 0]):
aa = a.copy()
aa[slice(pos[0], pos[0] + b.shape[0]),
slice(pos[1], pos[1] + b.shape[1])] = b.copy()
return aa
# Do the fill thing.
fill_a_with_b(a, b, choice)
这导致(例如)...
array([[0, 0, 0, 9],
[0, 3, 3, 7],
[0, 3, 3, 2],
[2, 3, 1, 5]])
我是一名优秀的程序员,十分优秀!