numpy 将邻域作为新的(第 3 个)维度存储到矩阵中
numpy store the neigborhood as new (3rd) dimension into matrix
给定一个像这样的 numpy 数组:
L = 2
np.random.randint([-1,1],size=(L,L), dtype=int)
array([[1, -1],
[-1, 1]])
如何(有效地)将其转换为相似形状的数组
np.random.choice([-1, 1], size=(2,2,4))
array([[[-1, -1, 1, 1],
[-1, -1, 1, -1]],
[[-1, 1, -1, 1],
[ 1, -1, 1, 1]]])
但与此处所示不同,第 3 维随机包含其中的 4 个邻居(在角上填充 0)。
即
[[1, -1], [-1, 1]]
第一个元素的邻域为:
- 0, 0, -1,-1,
- 第二个 1,0,0,1 等等。
我想将这个邻域向量存储到矩阵的第 3 维中。
这是否可以不手动循环矩阵?
编辑
例如:
[[1, -1], [-1, 1]]
[[[0,0,-1-1],
[1,0,0,1]],
...]
您可以尝试以下方法:
#sample array
a = np.arange(9).reshape(3, 3)
print(a)
它给出:
[[0 1 2]
[3 4 5]
[6 7 8]]
计算邻居数组:
p = np.pad(a, 1)
out = np.empty((*a.shape, 4), dtype=a.dtype)
out[..., 0] = p[:-2, 1:-1] #up
out[..., 1] = p[2:, 1:-1] #down
out[..., 2] = p[1:-1, :-2] #left
out[..., 3] = p[1:-1, 2:] #right
然后,例如 out[2, 1]
是 [4, 0, 6, 8]
即 a[2, 1]
的邻居数组 [up, down, left, right]
顺序(填充为 0)。
给定一个像这样的 numpy 数组:
L = 2
np.random.randint([-1,1],size=(L,L), dtype=int)
array([[1, -1],
[-1, 1]])
如何(有效地)将其转换为相似形状的数组
np.random.choice([-1, 1], size=(2,2,4))
array([[[-1, -1, 1, 1],
[-1, -1, 1, -1]],
[[-1, 1, -1, 1],
[ 1, -1, 1, 1]]])
但与此处所示不同,第 3 维随机包含其中的 4 个邻居(在角上填充 0)。
即
[[1, -1], [-1, 1]]
第一个元素的邻域为:
- 0, 0, -1,-1,
- 第二个 1,0,0,1 等等。
我想将这个邻域向量存储到矩阵的第 3 维中。
这是否可以不手动循环矩阵?
编辑
例如:
[[1, -1], [-1, 1]]
[[[0,0,-1-1], [1,0,0,1]],
...]
您可以尝试以下方法:
#sample array
a = np.arange(9).reshape(3, 3)
print(a)
它给出:
[[0 1 2]
[3 4 5]
[6 7 8]]
计算邻居数组:
p = np.pad(a, 1)
out = np.empty((*a.shape, 4), dtype=a.dtype)
out[..., 0] = p[:-2, 1:-1] #up
out[..., 1] = p[2:, 1:-1] #down
out[..., 2] = p[1:-1, :-2] #left
out[..., 3] = p[1:-1, 2:] #right
然后,例如 out[2, 1]
是 [4, 0, 6, 8]
即 a[2, 1]
的邻居数组 [up, down, left, right]
顺序(填充为 0)。