在具有可变边界大小的 3D numpy 数组中切片边界粒子的最简单方法

Easiest way to slice border particles in a 3D numpy array with variable border size

好的,所以我正在处理大型 3D numpy 数组,我想找到最简单的方法将数组(大小为 b)中的所有边框值设置为零...

例如,我有一个名为 labelled 的填充 3D numpy 数组,目前我有这样的东西...

labelled[[0,1,2,..b,-1,-2,-3,..-b],:,:] = 0
labelled[:,[0,1,2,..b,-1,-2,-3,..-b],:] = 0
labelled[:,:,[0,1,2,..b,-1,-2,-3,..-b]] = 0

每次更改 b 的值时,此方法都需要我逐字更改并写入 0-b 之间的所有值,这是非常不切实际的...

我已经尝试过...

labelled[([0:b],[-1:-b]),:,:] = 0
labelled[:,([0:b],[-1:-b]),:] = 0
labelled[:,:,([0:b],[-1:-b])] = 0

和...

labelled[[-b:b],:,:] = 0
labelled[:,[-b:b],:] = 0
labelled[:,:,[-b:b]] = 0

但它们不起作用。

欢迎大家提出任何建议,谢谢

这似乎有效:

x[ :b, :, :] = 0
x[-b:, :, :] = 0
x[:,  :b, :] = 0
x[:, -b:, :] = 0
x[:, :,  :b] = 0
x[:, :, -b:] = 0

创建要设置为零的此类索引的更通用的方法可能是这样的-

zero_idx = np.hstack((np.arange(b+1),-np.arange(1,b+1)))
labelled[zero_idx,:,:] = 0
labelled[:,zero_idx,:] = 0
labelled[:,:,zero_idx] = 0

样本运行-

In [153]: # Create a random input array filled with integers
     ...: labelled = np.random.randint(0,99,(7,8,9))
     ...: labelled_c1 = labelled.copy() # Create a copy for testing
     ...: 
     ...: labelled[[0,1,2,3,-1,-2,-3],:,:] = 0
     ...: labelled[:,[0,1,2,3,-1,-2,-3],:] = 0
     ...: labelled[:,:,[0,1,2,3,-1,-2,-3]] = 0
     ...: 
     ...: b = 3 # border parameter
     ...: 
     ...: zero_idx = np.hstack((np.arange(b+1),-np.arange(1,b+1)))
     ...: labelled_c1[zero_idx,:,:] = 0
     ...: labelled_c1[:,zero_idx,:] = 0
     ...: labelled_c1[:,:,zero_idx] = 0
     ...: 

In [154]: zero_idx
Out[154]: array([ 0,  1,  2,  3, -1, -2, -3])

In [155]: np.allclose(labelled,labelled_c1) # Verify results
Out[155]: True