如果小于指定大小,如何填充3d numpy数组

时间:2018-09-23 07:15:55

标签: python-3.x numpy

我正在处理CT扫描图像,我想从癌症的扫描位置提取一个小补丁,例如(16,40,40)(z,y,x),有时该位置在拐角处并且无法获取以前确定的大小,为解决该问题,我们尝试了全部填充,这是我的代码:

M,N,P=(16,40,40)
temp_img = np.ndarray([16,40,40],dtype=np.float32)

                center = np.array([node_z, node_y, node_x])   # nodule center
                v_center = np.rint((center-origin)/spacing)  # nodule center in voxel space (still x,y,z ordering)

                temp_imgtemp_img[:,:,:] = img_array[int(v_center[0]-(M/2)):int(v_center[0]+(M/2)),\
                                   int(v_center[1]-(N/2)):int(v_center[1]+(N/2)),\
                                   int(v_center[2]-(P/2)):int(v_center[2]+(P/2))]
                m,n,p=temp_img.shape
                a1,a2,b1,b2,c1,c2=0,0,0,0,0,0

                if (m,n,p) != (M,N,P):
                    if m != M:
                        a=M-m
                        a1=a/2
                        a2=a-a1

                    if n != N:
                        b=N-n
                        b1=b/2
                        b2=b-b1

                    if p != P:
                        c=P-p
                        c1=c/2
                        c2=c-c1   

                transform=((a1,a2),(b1,b2),(c1,c2))
                temp_img = np.pad(temp_img,transform,'linear_ramp')

                plt.imshow(temp_img[5], cmap='gray')
                plt.title('image')
                plt.grid(which='major', linewidth='0.8', color='red')
                plt.show()

但是我得到一个错误:

TypeError: `pad_width` must be of integral type.

通过将以下问题的答案之一中的a1=a/2更改为a1=a//2可以解决上述问题,但出现新错误:

could not broadcast input array from shape (20,50,50) into shape (25,50,50)

这意味着我的真正问题没有解决,因为尝试此解决方案时,值被四舍五入,并且形状变得比指定形状小或乞讨。

1 个答案:

答案 0 :(得分:1)

错误源于此:

a1=a/2

如果a为奇数,则a1将为浮点数。因此,您应该进行a//2之类的截断除法,或者舍入为int(round(a/2))之类的舍入并返回int。