Scilab转Python代码报错:numpy.ndarray对象不可调用,求排查
问题排查:Scilab转Python图像处理代码的赋值错误
原Scilab代码
for ( i = 0:roi_sx:imgg_sx-roi_sx) for ( j = 0:roi_sy:imgg_sy-roi_sy) intensity = 0; for ( m = i+1:1:i+roi_sx ) for ( n = j+1:1:j+roi_sy ) intensity = intensity + imgg(m,n); end end if ( intensity < threshold*roi_sx*roi_sy ) then imgs(i+1:1:i+roi_sx, j+1:1:j+roi_sy) = zeros(roi_sx, roi_sy); end end end
你的Python代码
for i in range(0,imgg_sx-roi_sx,roi_sx): for j in (0,imgg_sy-roi_sy,roi_sy): intensity = 0 for m in range (i+1,i+roi_sx,1): for n in range (j+1,j+roi_sy,1): intensity = intensity + (imggmatrix[m][n]) if intensity < threshold*roi_sx*roi_sy: imgs([i+1 for i in range(i+roi_sx)],[j+1 for j in range(j+roi_sx)]) = np.zeros((roi_sx, roi_sy),dtype=float) #np.imgs([i+1 for i in range(i+roi_sx)],[j+1 for j in range(j+roi_sx)]) = np.zeros((roi_sx, roi_sy),dtype=float)
报错信息
File "C:\Users\medyo\Desktop\MIP\DataMatrix\DataMatrix.py", line 26, in <module> imgs([i+1 for i in range(i+roi_sx)],[j+1 for j in range(j+roi_sx)]) TypeError: 'numpy.ndarray' object is not callable
问题分析与修正
1. 核心报错原因
numpy数组的索引必须用方括号[],你写成了圆括号(),这会把数组当成函数调用,直接触发TypeError。
2. 索引逻辑错误
Scilab是1-based索引,Python是0-based,且你用列表推导式生成的索引完全不符合需求:
- Scilab里的
i+1:1:i+roi_sx是从i+1到i+roi_sx的连续索引,对应Python里的切片应该是i:i+roi_sx(Python切片左闭右开,原Scilab的区间长度正好是roi_sx) - 你写的
[i+1 for i in range(i+roi_sx)]存在变量名冲突(循环变量i和推导式里的i重名),会生成错误的索引列表,完全没必要用列表推导式,直接用切片更高效。
3. 其他隐藏问题
- j循环写成了元组
(0,imgg_sy-roi_sy,roi_sy),这只会循环一次,应该改成range(0, imgg_sy - roi_sy + 1, roi_sy) - 四重循环计算intensity效率极低,用numpy的切片求和可以直接替代,大幅提升速度
修正后的代码
import numpy as np # 假设imggmatrix、imgs都是numpy数组 for i in range(0, imgg_sx - roi_sx + 1, roi_sx): for j in range(0, imgg_sy - roi_sy + 1, roi_sy): # 用numpy切片求和替代四重循环 roi = imggmatrix[i:i+roi_sx, j:j+roi_sy] intensity = np.sum(roi) if intensity < threshold * roi_sx * roi_sy: # 用切片赋值,直接覆盖对应区域 imgs[i:i+roi_sx, j:j+roi_sy] = np.zeros((roi_sx, roi_sy), dtype=float)
内容的提问来源于stack exchange,提问作者Mohamed Youssef M'hiri
相关产品推荐
相关产品推荐

