把代码复制到同一个程序但不起作用?切片索引必须是整数或无,或者有一个索引方法

2024-04-30 05:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

先谢谢你

凯蒂


Tags: inimageimportimginputnppltloc
3条回答

我发现问题是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中使用//可以得到所需的整数

尝试在那行中使用//而不是/

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引起的,而且您使用的是Anaconda,因此应该使用适当的Python版本创建一个新的conda环境。例如,如果原始代码是为Python 2.7编写的:

conda create -n myenv python=2.7 spyder scipy numpy PIL matplotlib

将创建一个名为myenv的新环境,其中包含python2.7、Spyder和代码所需的其他模块

要在此环境中使用Spyder,请先激活环境,然后运行Spyder:

activate myenv
spyder

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

相关问题 更多 >