Python和MATLAB矩阵索引的一个区别
这两天尝试将一个MATLAB工程转成Python,卡在一个bug上很久,最后发现是二者在矩阵索引上存在区别。这里我采用的是Python的NumPy库。
我们经常会通过一定的逻辑关系索引矩阵中的元素,并获取这些元素的位置信息,即indices。例如,123456% MATLAB实现x = resize(0:8, 3, 3);% 一维索引idx = find(x >= 3);% 二维索引[idr, idc] = find(x >= 3);
对应的python实现为,12345import numpy as npx = np.arange(9).reshape(3,3)# 只有二维索引[idr, idc] = np.where(x >= 3)
这里可以看出,MATLAB提供一种一维索引,即将二维矩阵以列为先,行次之转为一维向量,输出的索引对应该一维向量中元素所在位置。(这种处理方法经常可以用于加速运算,缩短运行时间。)然而,NumPy的where方法根据矩阵的维数提供对应axis的索引,没有MATLAB这种一维索引的输出。
因此,在python中使用np.where进行矩阵元素索引时,要注意如下两点,
- np.where的输出是一个列表;
- np.where的输出列表的元素个数与矩阵的维数对应。
Reference
[1] numpy.where