use*_*317 4 python numpy matrix
不确定这个问题的最佳标题是什么,但基本上我想根据提供的位置和指定的距离用一个值填充现有的 numpy 数组。假设对角线是无效的。
例如,假设我们有一个只有 0 的数组。
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)
如果我想要 (2,2) 作为距离为 1 的位置,它将用值 1 填充矩阵,在与提供的位置距离为 1 的位置(包括其自身)。因此矩阵看起来像:
[[0 0 0 0 0]
[0 0 1 0 0]
[0 1 1 1 0]
[0 0 1 0 0]
[0 0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)
如果我提供 2 的距离,它看起来像:
[[0 0 1 0 0]
[0 1 1 1 0]
[1 1 1 1 1]
[0 1 1 1 0]
[0 0 1 0 0]]
Run Code Online (Sandbox Code Playgroud)
基本上距离该位置 2 范围内的所有内容都将填充值 1。假设对角移动无效。
我也想支持环绕,如果相邻元素越界,它将环绕。
例如,如果提供的位置是 (4,4),距离为 1,则矩阵应如下所示:
[[0 0 0 0 1]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 1]
[1 0 0 1 1]]
Run Code Online (Sandbox Code Playgroud)
我尝试使用 np.ogrid 和一个掩码,其中 1 将是真的,但似乎无法让它工作。
您尝试做的本质上是binary dilation,但包装带来了问题。幸运的是,scipy的灰色膨胀函数具有wrap我们可以利用的模式:
from scipy.ndimage.morphology import grey_dilation, generate_binary_structure, iterate_structure
st = generate_binary_structure(2,1)
# st essentially defines "neighbours",
# and you can expand n times this using iterate_structure(st, n):
# >>> st
# array([[False, True, False],
# [ True, True, True],
# [False, True, False]])
# >>> iterate_structure(st,2)
# array([[False, False, True, False, False],
# [False, True, True, True, False],
# [ True, True, True, True, True],
# [False, True, True, True, False],
# [False, False, True, False, False]])
a = np.zeros((5,5))
a[4,4] = 1
dist = 1
dilated = grey_dilation(a, footprint = iterate_structure(st,dist), mode='wrap')
Run Code Online (Sandbox Code Playgroud)
作为为您创建数组的函数:
from scipy.ndimage.morphology import grey_dilation, generate_binary_structure, iterate_structure
def create(size, dist, loc):
a = np.zeros((size,size), dtype=int)
a[loc] = 1
st = generate_binary_structure(2,1)
return grey_dilation(a, footprint = iterate_structure(st,dist), mode='wrap')
Run Code Online (Sandbox Code Playgroud)
示例:要重现您想要的输入和输出:
>>> create(5, 1, (2,2))
array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]])
>>> create(5, 2, (2,2))
array([[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0]])
>>> create(5, 1, (4,4))
array([[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 1, 1]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
653 次 |
| 最近记录: |