已将代码复制到同一程序但无法正常工作?切片索引必须为整数或无,或具有__index__方法

时间:2018-08-25 12:07:27

标签: python spyder

嗨,我是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]

先谢谢您

凯蒂

3 个答案:

答案 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

您也许还可以在导航器中和/或通过“开始”菜单快捷方式执行此操作,但是命令行版本应该始终有效。