我有一个大的3D np.array
,比如说大小(200200,7)。你知道吗
我想对第一个轴上的每个2*2子数组应用np.rot90
。另一个问题是以随机方式旋转每个子数组。这样地:
这些颜色只是用来显示不同的2*2数组,箭头表示每个数组都是基于numpy.rot90(m, k=RND(1,2,3), axes=(0, 1))
中作为参数生成的随机数进行旋转的。你知道吗
这是否可以在一个快速的步骤中实现,而不必在每个子阵列上循环?你知道吗
基于Divakar的回答,我还试图做一个扩展,在这个扩展中,只有x%的子阵列在一步中移动,其余的保持不变,这很可能表现得像一个2D扩散系统。你知道吗
def vectorized_diffusion(a,H,W,pD):
#pD - chance that a sub-array is rotated in a random direction
rand_shift = np.random.randint(-1,2)
rand_axis = np.random.randint(0,2)
a = np.roll(a, shift = randshift, axis = rand_axis)
# Since the 2*2 subgrid system is fixed, I decided to ocassionally
#disturb the grid by rolling the whole array by one in a given
#direction, as in my work the array is a toroid grid i considered every direction
m,n,r = a.shape
a5D = a.reshape(m//H,H,n//W,W,-1)
cw0 = a5D[:,::-1,:,:,:].transpose(0,2,3,1,4)
ccw0 = a5D[:,:,:,::-1,:].transpose(0,2,3,1,4)
original = a5D[:,:,:,:,:].transpose(0,2,1,3,4)
mask_clockdirection = np.random.choice([False,True],size=(m//H,n//W))
mask_stationary = np.random.choice([True,False],size=(m//H,n//W), p=[1-pD,pD])
w0 = np.where(mask_clockdirection[:,:,None,None,None],cw0,ccw0)
out = np.where(mask_stationary[:,:,None,None,None],original,w0)
out = out.swapaxes(1,2).reshape(a.shape)
out_rerolled = np.roll(out, shift = -1*randshift, axis = rand_axis)
#this way the disturbed grid is rerolled into its original position
return out_rerolled
我知道这可能不是解决这个问题的最优雅的解决方案,但它似乎奏效了,我对此很满意。你知道吗
使用翻转和排列轴执行旋转(顺时针和逆时针)的通用方法-
扩展到带窗口旋转的
2D
数组扩展到
3D
数组,在每个2D切片上加窗旋转-解决我们的问题,用面具在这两者之间做出选择
我们需要让它为我们的案子工作。我们将使用掩码在顺时针和逆时针版本之间进行选择-
我们可以优化/使它更紧凑-
最后,让我们来处理一般情况-
以示例运行结束-
相关问题 更多 >
编程相关推荐