我遇到了以下问题,我正在运行一些python代码。它应该只是迭代一个列表,但它似乎做了一些奇怪和微妙的事情,我真的无法弄清楚。
from skimage.io import imread
def addImageData(self):
for image in self.images:
print image.signatureId
for image in self.images:
print image.signatureId
imageNumber = str(image.signatureId).zfill(4)
filePath = self.imageDirectory + imageNumber + ".jpg"
image.construct(filePath)
def construct(self, filePath):
self.imageData = imread(filePath, as_grey=True)
其中imread来自skimage.io。 addImageData下的第一个for循环工作完美,打印出一系列从1到600的数字。然而,第二个循环,当添加构造方法时,只需打印数字1直到遇到内存错误。老实说,我不知道是什么造成了这种情况。想法?
使用键盘中断时,这是追溯:
File "rbm.py", line 22, in buildImages
self.addImageData()
File "rbm.py", line 41, in addImageData
image.construct(filePath)
File "rbm.py", line 61, in construct
self.imageData = imread(filePath, as_grey=True)
File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/io/_io.py", line 142, in imread
img = rgb2grey(img)
File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/color/colorconv.py", line 540, in rgb2gray
return _convert(gray_from_rgb, rgb[:, :, :3])[..., 0]
File "/usr/local/lib/python2.7/dist-packages/scikit_image-0.8.2-py2.7-linux-i686.egg/skimage/color/colorconv.py", line 339, in _convert
out = np.dot(matrix, arr)
添加以下与self.images相关的所有代码:
class TrainingImages:
def __init__(self, csvFile = "../train.csv", imageDirectory = "../images/"):
self.csvFile = csvFile
self.imageDirectory = imageDirectory
self.images = []
def appendCsvLine(self, line):
'''Assumes the line is from a csv.reader object'''
signatureId = line[1]
if len(self.images) <= signatureId:
newImage = Image(signatureId)
self.images.append(newImage)
newImage.append(line)
else:
self.images[(signatureId-1)].append(line)
def buildImages(self):
with open(self.csvFile, 'rb') as strokeData:
reader = csv.reader(strokeData, delimiter=",")
for line in reader:
self.appendCsvLine(line)
self.addImageData()
答案 0 :(得分:1)
感谢所有评论人员,他们非常有帮助解决这个问题,但是当这一切都说完了,这是一个非常奇怪的错误,但我发现了源代码并希望分享它。
在函数appendCsvLine中,我显然将字符串与整数进行比较。 csv.reader类的结果始终是一个字符串,而不管条目中的实际对象如何。我隐含的假设是,我在做一些傻事,比如一个字符串和一个整数python会抛出一个valueError。显然事实并非如此。
def appendCsvLine(self, line):
'''Assumes the line is from a csv.reader object'''
signatureId = int(line[1])
if len(self.images) <= signatureId:
newImage = Image(signatureId)
self.images.append(newImage)
newImage.append(line)
else:
self.images[(signatureId-1)].append(line)
这个极小的变化修复了我的代码,这是一个非常难以追踪和查找的错误。最好通过以下代码片段来解释此问题:
>>> "100" > 99999999999999999999999
True
就我注意到这个问题的方法而言,我首先实现了EOL建议将行print [img.signatureID for img in self.images]
添加到我的代码中。我发现它打印出一个长数组,其中包含大量的1s,接着是大量的2s,接着是大量的3s等。
然后我开始查看实际构建图像的代码片段,并在appendCsvLine函数的if和else下放置简单的打印行。我意识到该程序从未到达else语句,并从那里我测试了if语句的输出,然后意识到将signatureId显式转换为整数可以解决问题。然后在使用csvl.reader在shell中运行一些测试并在python中比较字符串和整数后,我意识到了我的错误。