在python中仅使用for循环转置图像

在python中仅使用for循环转置图像,python,python-3.x,image,Python,Python 3.x,Image,我需要在python中转置图像,而不使用任何其他导入语句或函数库。图像正在作为参数传递给我的函数。该图像是RGB对象的二维表格。我有以下代码,但它给了我一个索引错误-列表索引超出范围。我做错了什么 #Find the size of the non-ragged table numrows = len(image) numcols = len(image[0]) # All rows have same no. cols # Build the table result = [] # Res

我需要在python中转置图像,而不使用任何其他导入语句或函数库。图像正在作为参数传递给我的函数。该图像是RGB对象的二维表格。我有以下代码,但它给了我一个索引错误-列表索引超出范围。我做错了什么

#Find the size of the non-ragged table
numrows = len(image) 
numcols = len(image[0]) # All rows have same no. cols

# Build the table
result = [] # Result accumulator
for m in range(numcols):
    
    # Make a single row
    row = [] # Single row accumulator
    for n in range(numrows):
        row.append(image[n][m])
    
    # Add the result to the table
    result.append(row)
    image.clear()
    image.append(row)
return True
每次通过外循环时,您都会尝试完全擦除
图像
,然后将最近计算的
附加到该行。但这是你的原始数据;下一次通过外部循环时,您尝试使用
row.append(image[n][m])
构建下一行,就好像什么都没有发生一样

您已经在使用
result
累积结果;在此过程中不要修改
图像
。它不仅会导致您所看到的问题,而且是糟糕的界面设计:使用您的代码的人(可能就是您,几个月后,当您忘记了自己在想什么时)当计算转置版本并给它一个单独的名称时,
image
的值绝对不会改变

您有一个名为
result
的列表,显然您是在函数中执行此操作的;自然的做法是
返回结果
,而不修改任何输入数据。如果出于某种原因您必须修改输入列表,那么方法是在所有循环之后一次性将
result
的内容分配回
image
列表:类似于
image[:]=result
。但是在这种情况下,没有很好的理由
返回任何东西
return True
并不意味着任何有用的东西(如果出现问题,您应该
返回False
或任何其他值;相反,您应该引发异常-这就是它们的目的)。因为在这种情况下,调用函数后,调用代码只需使用
image
的修改版本即可获得所需的所有信息,因此返回值是无用的。.

每次通过外循环时,您都会尝试完全擦除
图像
,然后将最近计算的
附加到该行。但这是你的原始数据;下一次通过外部循环时,您尝试使用
row.append(image[n][m])
构建下一行,就好像什么都没有发生一样

您已经在使用
result
累积结果;在此过程中不要修改
图像
。它不仅会导致您所看到的问题,而且是糟糕的界面设计:使用您的代码的人(可能就是您,几个月后,当您忘记了自己在想什么时)当计算转置版本并给它一个单独的名称时,
image
的值绝对不会改变


您有一个名为
result
的列表,显然您是在函数中执行此操作的;自然的做法是
返回结果
,而不修改任何输入数据。如果出于某种原因您必须修改输入列表,那么方法是在所有循环之后一次性将
result
的内容分配回
image
列表:类似于
image[:]=result
。但是在这种情况下,没有很好的理由
返回任何东西
return True
并不意味着任何有用的东西(如果出现问题,您应该
返回False
或任何其他值;相反,您应该引发异常-这就是它们的目的)。因为在这种情况下,调用函数后,调用代码只需使用
image
的修改版本即可获得所需的所有信息,因此返回值是无用的。.

有一个不需要任何导入的示例。您可以显示导致问题的
图像的起始值示例吗?实际上-您认为
image.clear()
行到底在做什么?在发生的地方发生这样的事情有意义吗?为什么?我的方法似乎与那篇文章中的建议相似。为什么我的方法在试图用原始图像中的像素创建转置副本时抛出错误。然后删除图像中的所有行,并将其替换为转置副本中的行。存在一个不需要任何导入的示例。您是否可以显示导致问题的
图像的示例起始值?实际上-您认为
image.clear()
行到底在做什么?在发生的地方发生这样的事情有意义吗?为什么?我的方法似乎与那篇文章中的建议相似。为什么我的方法在试图用原始图像中的像素创建转置副本时抛出错误。然后删除图像中的所有行,并将其替换为转置副本中的行。它需要修改图像。你是在建议我把它从外环中拿出来吗?谢谢谢谢你,谢谢你@Karl Knechtel!这就解决了问题!现在开始工作了。我是python新手,16年后又回到了编码领域。再次感谢!非常感谢。我的函数要求它不返回任何内容。它需要修改图像。你是在建议我把它从外环中拿出来吗?谢谢谢谢你,谢谢你@Karl Knechtel!这就解决了问题!现在开始工作了。我是python新手,16年后又回到了编码领域。再次感谢!非常感谢。