Python 如何使用周围三维阵列的值填充numpy三维阵列(或火炬张量)
我有一个形状为Python 如何使用周围三维阵列的值填充numpy三维阵列(或火炬张量),python,arrays,numpy,multidimensional-array,pytorch,Python,Arrays,Numpy,Multidimensional Array,Pytorch,我有一个形状为3,3,3的3D numpy数组,我想在其周围的数组中填充两层值,使其成为5,5,5数组 到目前为止,我使用torch cat功能(其工作原理与numpy concat相同)对y阵列进行了如下填充: x = torch.from_numpy(np.arange(1,28,1).reshape(3,3,3)) y = torch.from_numpy(np.arange(28,55,1).reshape(3,3,3)) z = torch.from_numpy(np.arange(
3,3,3
的3D numpy数组,我想在其周围的数组中填充两层值,使其成为5,5,5
数组
到目前为止,我使用torch cat功能(其工作原理与numpy concat相同)对y阵列进行了如下填充:
x = torch.from_numpy(np.arange(1,28,1).reshape(3,3,3))
y = torch.from_numpy(np.arange(28,55,1).reshape(3,3,3))
z = torch.from_numpy(np.arange(55,82,1).reshape(3,3,3))
torch.cat((y,z[:,:2,:]), dim=1) #To concat z+ with 2 pads
torch.cat((x[:,1:,:],y), dim=1) #To concat z- with 2 pads
torch.cat((y,z[:,:,:2]), dim=2) #To concat x+ with 2 pads
torch.cat((x[:,1:,:],y), dim=1) #To concat x- with 2 pads
torch.cat((x,z[:2,:,:]), dim=2) #To concat y+ with 2 pads
torch.cat((x[1:,:,:],y), dim=1) #To concat y- with 2 pads
但它没有给我正确的值。如何实现这一点?如果我理解正确,您需要的不是一个规则数组,因为每个维度都有不同的范围,这取决于观察到的轴(即,它不能几何表示为立方体-您的图片不是一个
(n,n,n)
数组)
无论如何,在下面的片段中,我们创建了一个(5,5,5)测试3D数组,可以从中对(3,3,3)数组进行采样。然后我们连续连接以获得原始数组,之后我们屏蔽不需要的单元格,以便输出如图片所示。请注意,在使用布尔Numpy数组时,可以使用+
或*
替换逻辑操作
import numpy as np
# Define dummy 3D field
n = 5
xx, yy, zz = np.ogrid[0:n, 0:n, 0:n]
field = np.sin(xx) + np.cos(yy) + np.tan(zz)
# Indices of 3 innermost elements - to form (3,3,3) array
i1, i2 = n//2 - 1, n//2 + 1
# Inner 3D array
subfield = np.copy(field)[i1:i2+1, i1:i2+1, i1:i2+1]
# Indices of "inferior" pads
x1 = y1 = z1 = np.arange(i1 - 1, i1)
# Indices of "superior" pads
x2 = y2 = z2 = np.arange(i2 + 1, i2 + 2)
# Padding in axis 0 (x)
padded = np.concatenate((field[x1, i1:i2+1, i1:i2+1], subfield))
padded = np.concatenate((padded, field[x2, i1:i2+1, i1:i2+1]))
# Padding in axis 1 (y)
padded = np.concatenate((field[i1-1:i2+2, y1, i1:i2+1], padded), axis = 1)
padded = np.concatenate((padded, field[i1-1:i2+2, y2, i1:i2+1]), axis = 1)
# Padding in axis 2 (z)
padded = np.concatenate((field[i1-1:i2+2, i1-1:i2+2, z1], padded), axis = 2)
padded = np.concatenate((padded, field[i1-1:i2+2, i1-1:i2+2, z2]), axis = 2)
# Check padded array is equal to original 3D array
print(np.all(padded == field))
## We now mask unwanted cells
indices = np.indices(padded.shape)
idx1, idx2 = indices == 0, indices == n - 1
xi, xf = idx1[0], idx2[0]
yi, yf = idx1[1], idx2[1]
zi, zf = idx1[2], idx2[2]
# Logical operations to mask proper slices
xm = (xi + xf) * (yi + yf + zi + zf) # masking in axis 0
ym = (yi + yf) * (xi + xf + zi + zf) # masking in axis 1
zm = (zi + zf) * (yi + yf + xi + xf) # masking in axis 2
mask = xm + ym + zm
# Masked (5,5,5) array
masked_padded = np.ma.masked_where(mask, padded)
顺便说一句,必须有更优雅的方法来实现相同的结果,但我没有太多地使用Numpy的高级索引:p如果我正确地遵循,您提出的操作将导致非矩形形状(基本上是5x5x5立方体,但缺少边和角),包含81个元素。5x5张量有125个元素。例如,您希望结果张量在索引(0,0,0)处具有什么值?如果你能提供一个很有帮助的输入/输出示例。@jodag我明白你的意思。边缘和角落区域将被留下。事实上,我不知道。问题是,我需要创建一个函数,从所有触摸框/阵列中获取所需的层数,并将它们连接起来