嗨,我对Python非常陌生,一直在使用Spyder为报表处理图像。我在家工作,下载了Anaconda Navigator来使用Spyder
下面的代码是直接从我的工作笔记本上复制的,它也使用Spyder,所以我不明白为什么“切片索引必须是整数或无或具有索引方法”的错误不断出现
from scipy.ndimage import interpolation
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
def normalise_image(input_img):
norm = (input_img-np.min(input_img))/(np.max(input_img)-np.min(input_img))
return norm
loc = 'C:/Users/Gemma/Documents/Katy College/Applications/NUFFIELD/Polarisation Data/THURSDAY/Abbypalm_thursday/'
loc1 = loc + 'Camera1/0.040.png'
loc2 = loc + 'Camera2/0.040.png'
Image1 = Image.open(loc1)
Image2 = Image.open(loc2)
Image1array = np.array(Image1, dtype=float)
Image2array = np.array(Image2, dtype=float)
# Flipped Image and Cut out last row
Image2array = np.flipud(Image2array)
Image2array = np.fliplr(Image2array)
Image2array = interpolation.rotate(Image2array,0.95)
mid_x, mid_y = Image2array.shape[0]/2, Image2array.shape[1]/2
offset_in_v = 5
Image2array = Image2array[mid_x-494/2+offset_in_v:mid_x+493/2+offset_in_v,
mid_y-660/2:mid_y+659/2]
color = 'binary'
Image2array=normalise_image(Image2array)
Image1array=normalise_image(Image1array)
DOP = np.zeros((Image2array.shape), dtype=float)
for i in range(Image2array.shape[0]):
for j in range(Image2array.shape[1]):
if (Image2array[i,j] + Image1array[i,j]) == 0:
DOP[i,j] = 0.0
else:
DOP[i,j] = (Image2array[i,j] -
Image1array[i,j])/(Image2array[i,j] + Image1array[i,j])
plt.figure('Parallel')
plt.imshow(Image1array,cmap='binary')
plt.colorbar()
plt.show()
plt.figure('Perpendicular')
plt.imshow(Image2array,cmap='binary')
plt.colorbar()
plt.show()
plt.figure('DOP')
plt.imshow(DOP,cmap=color)
plt.colorbar()
plt.imsave(loc + 'DOP'+color+'.png',DOP,cmap=color)
plt.show()
我把所有的代码都放进去了,因为我不知道哪个最重要。我的主管口授代码让我写。Spyder说问题出在第36行:Image2array=Image2array[mid_x-494/2+offset_in_v:mid_x+493/2+offset_in_v,mid_y-660/2:mid_y+659/2]
先谢谢你
凯蒂
我发现问题是
Image2array = Image2array[mid_x-494/2+offset_in_v:mid_x+493/2+offset_in_v, mid_y-660/2:mid_y+659/2]
导致浮点切片索引,可能是因为在计算这些索引时缺少运算符优先级,以及在不同版本的Python中整数除法的行为Image2array=Image2array[mid_x-494/2+offset_in_v:mid_x+493/2+offset_in_v,mid_y-660/2:mid_y+659/2]
一个例子是上面突出显示的
mid_y+659/2
,其中/
比+
具有更高的优先级,因此操作将被评估为mid_y+(659/2)
,首先评估659/2
,并将其结果329.5
添加到mid_y
。因此,即使mid_y
是一个int,也会以.5
结束,并用一个.5
对索引进行切片我建议加入
()
来遵循您的优先顺序另外,在python2和python3之间,
/
的行为也发生了变化,因为您从一台机器上复制了脚本,而这台机器运行的Python版本可能与您使用的不同,您可能必须使用底除法运算符//
来删除python3中整数除法的浮点,而python2中的/
总是这样如果在具有不同python版本的机器之间进行复制,
/
操作符的含义的改变可能会导致错误。在旧的Python中,整数之间的
/
会产生一个整数。年轻的Python会产生漂浮物。
在年轻的pythons中使用
//
可以得到所需的整数尝试在那行中使用
//
而不是/
->
由于问题似乎是由不同版本的Python引起的,而且您使用的是Anaconda,因此应该使用适当的Python版本创建一个新的
conda
环境。例如,如果原始代码是为Python 2.7编写的:conda create -n myenv python=2.7 spyder scipy numpy PIL matplotlib
将创建一个名为
myenv
的新环境,其中包含python2.7、Spyder和代码所需的其他模块要在此环境中使用Spyder,请先激活环境,然后运行Spyder:
您也可以在导航器和/或通过“开始”菜单快捷方式执行此操作,但命令行版本应始终有效
相关问题 更多 >
编程相关推荐