我有一个使用numpy的python脚本,它应该在返回单个值之前获取一个图像并执行一些计算。当我单独执行每一行时,它会按预期工作。当我把它们放在一个.py脚本中,并从命令行或在Canopy中运行它时,它返回一个数组。在
我稍微修改了代码,不需要通常的图像输入,结果是一样的:
import numpy as np
# Instead of loading an image, generate a test case (w or wo structured noise)
roi = np.random.poisson(38,(256,256));
blob = np.random.poisson(5,(128,128));
roi[64:192,64:192] = roi[64:192,64:192]+blob;
# Load the other variables if necessary (i.e., no DICOM to load)
[xDim,yDim] = [512,512];
roiLength = xDim/2;
pix = 1.18958;
# Declare memory for the FFTs
sizeFFT = xDim;
NPS2D = np.zeros((sizeFFT,sizeFFT)); # declare memory for fft results
fftslice = np.zeros((sizeFFT,sizeFFT));
# Set the dimension of the ROI and pull the pixel size. This will be
# used for the scaling factor in the 2D NPS.
deltaX = pix;
deltaY = pix;
scaleFactor = (deltaX/roiLength)*(deltaY/roiLength);
# Calculate the NPS
roiMean = np.mean(roi);
fftslice = np.fft.fft2((roi-roiMean),s=[sizeFFT,sizeFFT]);
NPS2D = scaleFactor*np.fft.fftshift(np.multiply(fftslice,np.conj(fftslice)));
NPS2D = NPS2D.real;
# Subtract the white noise from the NPS to get the structured NPS
stNPS = NPS2D - roiMean*deltaX*deltaY;
# Calculate SNI
SNI=sum(stNPS)/sum(NPS2D);
# Display the result
print SNI;
如果我执行每一行,结果是0.107213670449(或者类似,因为它每次都重新生成一个随机数组)。如果我使用python foo.py
从命令行运行脚本,或者单击Canopy中的play按钮,结果是一个512长度的数组[4.64940089e-03 ... -4.59789051e-02 -7.15113682e-02]
,其中我手动删除了509个条目。在
有什么想法吗?我错过了什么明显的东西吗?在
使用内置的
sum
函数与使用numpy.sum
或数组的sum
方法不同。在对于>;1d数组,python的
sum
将给出截然不同的结果:这是因为python的sum基本上是对对象上的for循环求和。在
在一个>;1d数组上循环将返回沿第一个轴的切片。E、 g
^{pr2}$在本例中,Python的
sum
有效地给出了列的总和(即row1 + row2 + row3 ...
)以默认的python方式跨列进行求和。你得到了一个长度为512的数组
相反,请尝试numpy中的
^{pr2}$sum
相关问题 更多 >
编程相关推荐