嗨,我是Python的新手,一直在使用Spyder处理报告的图像。我在家工作,并下载了Anaconda Navigator以使用Spyder。
以下代码是直接从也使用Spyder的工作笔记本电脑中复制的,所以我不明白为什么为什么会出现错误“切片索引必须为整数或None或具有 index 方法”接下来。
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]
先谢谢您
凯蒂
答案 0 :(得分:0)
我认为问题是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
我建议添加()
以遵循您的优先顺序。
在Python 2和3之间,/
的行为也发生了变化,并且由于您是从一台计算机上复制脚本的,而该计算机可能正在运行与所使用的Python版本不同的Python,因此您可能必须使用底数除法运算符//
可以在Python 3中删除整数除法上的浮点,而Python 2中的/
就是这种情况
答案 1 :(得分:0)
如果您在具有不同python版本的机器之间进行复制,则/
运算符的含义更改可能会绊倒您。
在较旧的python中,整数之间的/
导致一个整数。
年轻的python会导致浮动。
在较年轻的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]
->
Image2array = Image2array[mid_x-494//2+offset_in_v:mid_x+493//2+offset_in_v,
mid_y-660//2:mid_y+659//2]
答案 2 :(得分:0)
由于问题似乎是由不同版本的Python引起的,并且由于您使用的是Anaconda,因此应使用适当的Python版本创建一个新的conda
环境。例如,如果原始代码是为Python 2.7编写的:
conda create -n myenv python=2.7 spyder scipy numpy PIL matplotlib
将创建一个名为myenv
的新环境,其中包含Python 2.7,Spyder和您的代码所需的其他模块。
要在此环境中使用Spyder,请先激活该环境,然后运行Spyder:
activate myenv
spyder
您也许还可以在导航器中和/或通过“开始”菜单快捷方式执行此操作,但是命令行版本应该始终有效。