python - 如何将一个数组插入到另一个只有零的数组中(使用 Numpy)

标签 python arrays numpy matrix

我在 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.convolve2dmode='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]])

关于python - 如何将一个数组插入到另一个只有零的数组中(使用 Numpy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57878713/

相关文章:

python - 你如何从 Bokeh 中的 Pandas GroupBy 绘图?

java - 如何通过跳转复制数组?

java - 有什么方法可以内联声明数组吗?

arrays - 如何连续重复一系列操作中的一个操作

python - 如何根据输入获取一维 numpy 数组的所有可能切片

python - 如何将 numpy 数组乘以 numpy 矩阵?

python - 惰性评估是如何实现的(例如在 ORM 中)

python - 在递归函数中收集参数

python - a(* {'q' :'qqq' }),为什么只打印 key

python - Panda-Column 作为 numpy 数组的索引