MATLAB与Python数组索引差异及等效结果获取方法咨询
MATLAB与Python多维数组线性索引的差异及解决方案
错误原因
- MATLAB对多维数组传单个索引数组取值时,默认采用列优先(Fortran序)的线性索引规则:先把整个多维数组按列优先顺序拍平为1维数组,再按索引取值;同时MATLAB索引从1开始计数。
- Python的numpy数组传单个索引数组取值时,默认仅对第0维度(图像的行维度,总长度366)做索引,你传入的redIdx数值远大于366,自然触发越界报错;且numpy索引默认从0开始计数。
等效实现方案
你只需要将numpy数组显式按列优先规则拍平后再做索引,即可得到和MATLAB完全一致的结果,操作代码如下:
import numpy as np # 提前将redIdx转为1维,方便后续索引 redIdx_np = redIdx.flatten() # 等效MATLAB的image(redIdx) flatten_img = image.flatten(order='F') # order='F'指定列优先拍平,和MATLAB规则一致 res_img = flatten_img[redIdx_np - 1].reshape(-1, 1) # 减1适配0基索引,reshape恢复2×1形状 # 等效MATLAB的image2(redIdx) flatten_img2 = image2.flatten(order='F') res_img2 = flatten_img2[redIdx_np - 1].reshape(-1, 1)
验证说明
你的图像总元素数为 366 * 791 * 3 = 868518,redIdx的两个数值289485、289486均小于总元素数,拍平后索引不会越界,返回结果和MATLAB完全一致。
内容的提问来源于stack exchange,提问作者Zyder
相关产品推荐
相关产品推荐

