NumPy 数组的反向堆叠操作
Reverse stacking operation on NumPy array
我有一行代码可以有效地将 numpy 数组从 400x8x8 数组重塑为 160x160 数组,我需要反转该过程但无法弄清楚该行的反转。
我已经可以执行此过程,但它非常低效并且需要嵌套循环,出于性能目的我想避免这种循环。
这是我目前必须逆向处理的代码 (160x160 > 400x8x8):
previousRow = 0
for rowBlock in range(noBlocksOn1Axis):
previousRow = rowBlock * blockSize
previousColumn = 0
for columnBlock in range(noBlocksOn1Axis):
previousColumn = columnBlock * blockSize
block =
arrayY[previousRow:previousRow+blockSize,
previousColumn:previousColumn + blockSize]
blocksList.append(block)
这里是重塑 400x8x8 > 160x160 的代码行:
xy = np.zeros((160,160), dtype = np.uint8)
xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in
range(overDone.shape[0]//20))
关于如何反向执行这行代码有什么想法吗?
谢谢 :D
numpy.reshape
怎么了?
my_array_3d = my_array.reshape((400, 8, 8))
my_array_2d = my_array.reshape((160, 160))
重塑、交换轴(或转置轴)并重塑以获得 overDone
返回 -
xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
有关 的更多信息。
使其通用以处理通用形状 -
m,n = xy.shape
M,N = 20,20 # block size used to get xy
overDone_ = xy.reshape(M,m//M,N,n//N).swapaxes(1,2).reshape(-1,m//M,n//N)
样本运行-
# Original input
In [21]: overDone = np.random.rand(400,8,8)
# Perform forward step to get xy
In [22]: xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in range(overDone.shape[0]//20))
# Use proposed approach to get back overDone
In [23]: out = xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
# Verify output to be same as overDone
In [42]: np.array_equal(out,overDone)
Out[42]: True
奖金:
我们可以使用相同的向量化 reshape+permute-axes
步骤来为正向过程创建 xy
-
xy = overDone.reshape(20,20,8,8).swapaxes(1,2).reshape(160,160)
我有一行代码可以有效地将 numpy 数组从 400x8x8 数组重塑为 160x160 数组,我需要反转该过程但无法弄清楚该行的反转。
我已经可以执行此过程,但它非常低效并且需要嵌套循环,出于性能目的我想避免这种循环。
这是我目前必须逆向处理的代码 (160x160 > 400x8x8):
previousRow = 0
for rowBlock in range(noBlocksOn1Axis):
previousRow = rowBlock * blockSize
previousColumn = 0
for columnBlock in range(noBlocksOn1Axis):
previousColumn = columnBlock * blockSize
block =
arrayY[previousRow:previousRow+blockSize,
previousColumn:previousColumn + blockSize]
blocksList.append(block)
这里是重塑 400x8x8 > 160x160 的代码行:
xy = np.zeros((160,160), dtype = np.uint8)
xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in
range(overDone.shape[0]//20))
关于如何反向执行这行代码有什么想法吗?
谢谢 :D
numpy.reshape
怎么了?
my_array_3d = my_array.reshape((400, 8, 8))
my_array_2d = my_array.reshape((160, 160))
重塑、交换轴(或转置轴)并重塑以获得 overDone
返回 -
xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
有关
使其通用以处理通用形状 -
m,n = xy.shape
M,N = 20,20 # block size used to get xy
overDone_ = xy.reshape(M,m//M,N,n//N).swapaxes(1,2).reshape(-1,m//M,n//N)
样本运行-
# Original input
In [21]: overDone = np.random.rand(400,8,8)
# Perform forward step to get xy
In [22]: xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in range(overDone.shape[0]//20))
# Use proposed approach to get back overDone
In [23]: out = xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
# Verify output to be same as overDone
In [42]: np.array_equal(out,overDone)
Out[42]: True
奖金:
我们可以使用相同的向量化 reshape+permute-axes
步骤来为正向过程创建 xy
-
xy = overDone.reshape(20,20,8,8).swapaxes(1,2).reshape(160,160)