python - 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
提前致谢。
解决方案
我前段时间问过类似的问题: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
推荐阅读
- c++ - std::set(rb-tree) 和 std::unordered_set(hashtable) 占用多少堆栈内存?
- django - 如何从 django 中的以下数据中仅获取“标题”属性值
- matplotlib - matplotlib GIF 中的颜色条:为什么标签会消失?
- r - 如何为每个分组元素选择随机的非连续日期?
- javascript - ES6 如何在不分配变量的情况下使用对象解构
- mongodb - 使用 pymongo 获取集合模式
- node.js - 如何根据下拉列表中选择的值添加新的 div
- reactjs - 如何为 react-calendar 创建事件
- angular - Angular 2+ @ng-select/ng-select:如何更改键、值数组
- anylogic - 在 RunTime 之前编辑参数