首页 > 解决方案 > Numpy - 将小数组放在大数组的坐标处?

问题描述

我有以下 2D-numpy 数组:

matrix = np.zeros((250, 250))

现在,在各种坐标处,我不仅要替换坐标值,还要用较小的数组替换它的局部附近。作为示例性的替换,我们可以拿一颗钻石:

import skimage.morphology
star = skimage.morphology.diamond(3)  # small array / replacement

coords_r = np.random.randint(0, 250, 20)  # row coordinates
coords_c = np.random.randint(0, 250, 20)  # column coordinates

我想出了以下相当草率的方式,想知道是否有更简单/更优雅的解决方案。此外,如果两个对象足够接近,此方法将覆盖:

max_r, max_c = matrix.shape
obj = star
half_obj = int((star.shape[0])/2)

for r, c in zip(coords_r, coords_c):
    
    curr_obj = obj
    start_r = r-half_obj-1
    end_r = r+half_obj
    start_c = c-half_obj-1
    end_c = c+half_obj
    
    # Check if on corners
    if r-half_obj-1 < 0:
        start_r = 0
        curr_obj = curr_obj[-r:, :]
    if r+half_obj > matrix.shape[0]:
        end_r = max_r
        curr_obj = curr_obj[:max_r-start_r, :]
    if c-half_obj-1 < 0:
        start_c = 0
        curr_obj = curr_obj[:, -c:]
    if c+half_obj > matrix.shape[1]:
        end_c = max_c
        curr_obj = curr_obj[:, :max_c-start_c]
        
    matrix[start_r:end_r, start_c:end_c] = curr_obj

提前致谢。

标签: pythonarraysnumpy

解决方案


我前段时间问过类似的问题:Add small image to the canvas as numpy arrays

这是我对您的问题的解决方案:

matrix_size = 250
star_size = 3

matrix = np.ones((matrix_size, matrix_size))
star = 1 - skimage.morphology.diamond(star_size)

coords_r = np.random.randint(0, matrix_size, 20)  # row coordinates
coords_c = np.random.randint(0, matrix_size, 20)  # column coordinates

for r, c in zip(coords_r, coords_c):
    matrix[max(r - star_size, 0):r + star_size + 1, max(c - star_size, 0):c + star_size + 1] *= star[max(star_size - r, 0):star_size + matrix_size - r, max(star_size - c, 0):star_size + matrix_size - c]
matrix = 1-matrix

这就是我得到的: 在此处输入图像描述


推荐阅读