Matlab矩阵列访问特性对应的numpy数组索引实现咨询
Numpy实现Matlab三维数组降维列索引方案
numpy默认不支持Matlab这种自动将高维数组按列优先规则拍平后取列的索引方式,但可以通过简单的数组操作实现完全一致的访问效果。
核心规则差异
- Matlab默认采用列优先(Fortran顺序)存储数组,使用
m(:,n)索引时会自动将高于2维的维度按列优先规则拍平为二维数组,再取对应列,且索引从1开始计数。 - Numpy默认采用行优先(C顺序)存储数组,直接写
m[:,n]会直接索引数组的第二维度,不会自动合并更高维度,且索引从0开始计数。
实现方案
首先是你给出的示例数组初始化代码:
import numpy as np m = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
方案1:临时转换实现单次索引
不需要修改原数组的结构和存储顺序,单次访问时直接通过指定reshape顺序实现:
# 对应Matlab m(:,1),输出 [1 3] print(m.reshape(m.shape[0], -1, order='F')[:, 0]) # 对应Matlab m(:,2),输出 [2 4] print(m.reshape(m.shape[0], -1, order='F')[:, 1]) # 对应Matlab m(:,3),输出 [5 7] print(m.reshape(m.shape[0], -1, order='F')[:, 2]) # 对应Matlab m(:,4),输出 [6 8] print(m.reshape(m.shape[0], -1, order='F')[:, 3])
方案2:预转换为二维数组(适合频繁访问场景)
如果需要多次做这类索引,可以先把数组转换为符合预期的二维数组,后续直接索引即可:
# 转换为列优先的二维数组,形状为(2,4) m_2d = m.reshape(m.shape[0], -1, order='F') # 后续直接索引即可 print(m_2d[:,0]) # 输出 [1 3] print(m_2d[:,1]) # 输出 [2 4] print(m_2d[:,2]) # 输出 [5 7] print(m_2d[:,3]) # 输出 [6 8]
内容的提问来源于stack exchange,提问作者CoolGas
相关产品推荐
相关产品推荐

