循环生成12个480×600复数numpy数组,如何正确存入目标数组?
解决方法
问题根源
你初始化的self.espacial是形状为(0,12)的二维数组,但每次生成的filt是(480,600)的二维数组,两者维度不匹配,所以np.append报错。另外,np.append在循环里会反复创建新数组并复制数据,效率很低,不推荐这么用。
方案一:用列表收集再转numpy数组(推荐)
这种方式效率远高于循环调用np.append,操作也更简单:
- 在类的
__init__里初始化一个空列表,替代原来的空numpy数组:self.espacial_list = [] - 循环生成
filt后,直接把数组追加到列表中:for oo in range(norient): ... for ss in range(nscale): filt = logGabor[ss] * spread self.espacial_list.append(filt) - 循环结束后,将列表转换为numpy数组:
最终self.espacial = np.array(self.espacial_list)self.espacial的形状为(12, 480, 600),如果需要调整维度顺序(比如把12放到最后),可以用np.moveaxis或np.transpose修改。
方案二:预先分配数组再填充
如果提前明确要生成12个480×600的复数数组,可以直接预先分配好内存,再逐个填充:
- 在
__init__里初始化固定形状的数组:self.espacial = np.empty(shape=(12, 480, 600), dtype=complex) - 循环中用计数器或循环变量索引赋值,比如设置一个计数器:
也可以直接用循环变量计算索引:idx = 0 for oo in range(norient): ... for ss in range(nscale): filt = logGabor[ss] * spread self.espacial[idx] = filt idx += 1idx = oo * nscale + ss(前提是norient * nscale = 12),这样不需要额外的计数器。
内容的提问来源于stack exchange,提问作者Konki
相关产品推荐
相关产品推荐

