Python 有没有一种快速的方法可以将numpy图像分块洗牌?

Python 有没有一种快速的方法可以将numpy图像分块洗牌?,python,image,numpy,Python,Image,Numpy,我想写一个函数,可以拍摄小图像并返回它们的排列,按块排列 基本上,我想把这个转变为: 为此: 有一个很好的答案帮助我写了一个解决方案。但是,对于约50000个28x28图像,这需要很长时间才能运行 # blocks of 7x7 shuffling range1 = np.arange(4) range2 = np.arange(4) block_size = int(28 / 4) print([[x[i*block_size:(i+1)*block_size].shape] for i

我想写一个函数,可以拍摄小图像并返回它们的排列,按块排列

基本上,我想把这个转变为:

为此:

有一个很好的答案帮助我写了一个解决方案。但是,对于约50000个28x28图像,这需要很长时间才能运行

# blocks of 7x7 shuffling
range1 = np.arange(4) 
range2 = np.arange(4)
block_size = int(28 / 4)
print([[x[i*block_size:(i+1)*block_size].shape] for i in range1])
for x in x1:
  np.random.shuffle(range1)
  x[:] = np.block([[x[i*block_size:(i+1)*block_size]] for i in range1])
  for a in x:
    np.random.shuffle(range2)
    a[:] = np.block([a[i*block_size:(i+1)*block_size] for i in range2])

print("x1", time.time() - begin)
begin = time.time()

我已经找到了一个运行速度更快的解决方案。我觉得很傻,因为我真的不需要一个双for循环,只需要两个单独的shuffle索引。将此解决方案留在这里,以防有人想在numpy中按块洗牌图像

如果有人想出另一个好办法,请告诉我


# blocks of 7x7 shuffling
range1 = np.arange(4) 
range2 = np.arange(4)
block_size = int(28 / 4)
for x in x1:
  np.random.shuffle(range1)
  np.random.shuffle(range2)
  x[:] = np.block([[x[i*block_size:(i+1)*block_size]] for i in range1])
  x[:] = np.block([x[:,i*block_size:(i+1)*block_size] for i in range2])

这里有一种基于-

样本运行-

In [46]: x1
Out[46]: 
array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11],
        [12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23],
        [24, 25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34, 35]],

       [[36, 37, 38, 39, 40, 41],
        [42, 43, 44, 45, 46, 47],
        [48, 49, 50, 51, 52, 53],
        [54, 55, 56, 57, 58, 59],
        [60, 61, 62, 63, 64, 65],
        [66, 67, 68, 69, 70, 71]]])

In [47]: np.random.seed(0)

In [48]: randomize_tiles_3D(x1, H=3, W=3)
Out[48]: 
array([[[21, 22, 23,  0,  1,  2],
        [27, 28, 29,  6,  7,  8],
        [33, 34, 35, 12, 13, 14],
        [18, 19, 20,  3,  4,  5],
        [24, 25, 26,  9, 10, 11],
        [30, 31, 32, 15, 16, 17]],

       [[36, 37, 38, 54, 55, 56],
        [42, 43, 44, 60, 61, 62],
        [48, 49, 50, 66, 67, 68],
        [39, 40, 41, 57, 58, 59],
        [45, 46, 47, 63, 64, 65],
        [51, 52, 53, 69, 70, 71]]])

还要注意,这并不是完全随机的。垂直杆的每一段始终相互对应,水平杆也是如此。
In [46]: x1
Out[46]: 
array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11],
        [12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23],
        [24, 25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34, 35]],

       [[36, 37, 38, 39, 40, 41],
        [42, 43, 44, 45, 46, 47],
        [48, 49, 50, 51, 52, 53],
        [54, 55, 56, 57, 58, 59],
        [60, 61, 62, 63, 64, 65],
        [66, 67, 68, 69, 70, 71]]])

In [47]: np.random.seed(0)

In [48]: randomize_tiles_3D(x1, H=3, W=3)
Out[48]: 
array([[[21, 22, 23,  0,  1,  2],
        [27, 28, 29,  6,  7,  8],
        [33, 34, 35, 12, 13, 14],
        [18, 19, 20,  3,  4,  5],
        [24, 25, 26,  9, 10, 11],
        [30, 31, 32, 15, 16, 17]],

       [[36, 37, 38, 54, 55, 56],
        [42, 43, 44, 60, 61, 62],
        [48, 49, 50, 66, 67, 68],
        [39, 40, 41, 57, 58, 59],
        [45, 46, 47, 63, 64, 65],
        [51, 52, 53, 69, 70, 71]]])