You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:55:24