在具有可变边界大小的 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
好的,所以我正在处理大型 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