Numpy 比例 3D 阵列
Numpy scale 3D array
我正在尝试将 3D 阵列缩放到 64x64x64 大小(从更大的非立方体大小),同时保持纵横比。
我在这样的二维数组中做了同样的事情:
pad = Input.size[1]-Input.size[0]
padLeft = math.ceil(pad/2)
padRight = math.floor(pad/2)
if(pad > 0):
paddedInput = np.pad(Input, ((0,0), (padLeft,padRight)), 'constant', constant_values=(0,0))
else:
paddedInput = np.pad(Input, ((math.fabs(padLeft),math.fabs(padRight)), (0,0)), 'constant', constant_values=(0,0))
Output = misc.imresize(paddedInput,(InputHeight,InputHeight))
有没有办法在 N (=3) 个维度上实现同样的事情?
编辑:我尝试转换为 3D:
pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]
paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))
print(paddedInput.shape)
for dimension in range(0,3):
padLeft = math.ceil(pad[dimension,0]/2)
padRight = math.floor(pad[dimension,0]/2)
if((padLeft > 0) or (padRight > 0)):
if dimension == 0:
paddedInput = np.pad(Input, ((padLeft,padRight),(0,0),(0,0)), 'constant', constant_values=0)
elif dimension == 1:
paddedInput = np.pad(paddedInput, ((0,0), (padLeft,padRight),(0,0)), 'constant', constant_values=0)
elif dimension == 2:
paddedInput = np.pad(paddedInput, ((0,0),(0,0), (padLeft,padRight)), 'constant', constant_values=0)
print(paddedInput.shape)
这会运行,但是被填充的维度被填充了它们需要的两倍的量...
看看 scipy.ndimage
中的 zoom。在这里,您提供沿每个轴的缩放因子,而不是最终的立方体大小,但这很容易弄清楚。
inarr = np.ones((32,32,32))
outarr = ndimage.zoom(inarr, 2)
outarr.shape
(64, 64, 64)
答案是先用pad再numpy.ndarray.resize() :
pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]
paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))
paddedInput = np.pad(Input, ((int(math.ceil(pad[0,0]/2)),
int(math.floor(pad[0,0]/2))),(int(math.ceil(pad[1,0]/2)),
int(math.floor(pad[1,0]/2))),(int(math.ceil(pad[2,0]/2)),
int(math.floor(pad[2,0]/2)))), 'constant', constant_values=0)
paddedInput.resize((64,64,64))
在一行中完成全部填充可以修复所有错误。
我正在尝试将 3D 阵列缩放到 64x64x64 大小(从更大的非立方体大小),同时保持纵横比。
我在这样的二维数组中做了同样的事情:
pad = Input.size[1]-Input.size[0]
padLeft = math.ceil(pad/2)
padRight = math.floor(pad/2)
if(pad > 0):
paddedInput = np.pad(Input, ((0,0), (padLeft,padRight)), 'constant', constant_values=(0,0))
else:
paddedInput = np.pad(Input, ((math.fabs(padLeft),math.fabs(padRight)), (0,0)), 'constant', constant_values=(0,0))
Output = misc.imresize(paddedInput,(InputHeight,InputHeight))
有没有办法在 N (=3) 个维度上实现同样的事情?
编辑:我尝试转换为 3D:
pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]
paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))
print(paddedInput.shape)
for dimension in range(0,3):
padLeft = math.ceil(pad[dimension,0]/2)
padRight = math.floor(pad[dimension,0]/2)
if((padLeft > 0) or (padRight > 0)):
if dimension == 0:
paddedInput = np.pad(Input, ((padLeft,padRight),(0,0),(0,0)), 'constant', constant_values=0)
elif dimension == 1:
paddedInput = np.pad(paddedInput, ((0,0), (padLeft,padRight),(0,0)), 'constant', constant_values=0)
elif dimension == 2:
paddedInput = np.pad(paddedInput, ((0,0),(0,0), (padLeft,padRight)), 'constant', constant_values=0)
print(paddedInput.shape)
这会运行,但是被填充的维度被填充了它们需要的两倍的量...
看看 scipy.ndimage
中的 zoom。在这里,您提供沿每个轴的缩放因子,而不是最终的立方体大小,但这很容易弄清楚。
inarr = np.ones((32,32,32))
outarr = ndimage.zoom(inarr, 2)
outarr.shape
(64, 64, 64)
答案是先用pad再numpy.ndarray.resize() :
pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]
paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))
paddedInput = np.pad(Input, ((int(math.ceil(pad[0,0]/2)),
int(math.floor(pad[0,0]/2))),(int(math.ceil(pad[1,0]/2)),
int(math.floor(pad[1,0]/2))),(int(math.ceil(pad[2,0]/2)),
int(math.floor(pad[2,0]/2)))), 'constant', constant_values=0)
paddedInput.resize((64,64,64))
在一行中完成全部填充可以修复所有错误。