首页 > 解决方案 > 访问matlab矩阵的列及其在numpy中的实现

问题描述

我正在尝试找到一种访问与 Matlab 的功能相对应的 numpy 数组元素的实现。

假设给定一个(2,2,2)Matlab 矩阵m,形式为

m(:,:,1) = [1,2;3,4]
m(:,:,2) = [5,6;7,8]

即使这是一个 3-d 数组,Matlab 也允许以如下方式访问它的列

m(:,1) = [1;3]
m(:,2) = [2;4]
m(:,3) = [5;7]
m(:,4) = [6;8]

我很想知道,如果 numpy 支持这样的索引,那么给定以下数组

m = array([[[1, 2],
            [3, 4]],

           [[5, 6],
            [7, 8]]])

也可以按照上面列出的 Matlab 的方式访问列。

标签: pythonnumpymatlab

解决方案


In [41]: m = np.arange(1,9).reshape(2,2,2)
In [42]: m
Out[42]: 
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

索引等效块:

In [47]: m[0,:,0]
Out[47]: array([1, 3])
In [48]: m[0,:,1]
Out[48]: array([2, 4])
In [49]: m[1,:,0]
Out[49]: array([5, 7])
In [50]: m[1,:,1]
Out[50]: array([6, 8])

我们可以重塑,以“展平”一对维度:

In [84]: m = np.arange(1,9).reshape(2,2,2)
In [85]: m.reshape(2,4)
Out[85]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
In [87]: m.reshape(2,4)[:,2]
Out[87]: array([3, 7])

并进行转置:

In [90]: m.transpose(1,0,2).reshape(2,4)
Out[90]: 
array([[1, 2, 5, 6],
       [3, 4, 7, 8]])

MATLAB 最初是严格的 2d 的。然后在 v3.9 (2000) 左右的某个时候,他们允许更多,但以一种笨拙的方式。他们添加了一种方法来索引尾随维度,就好像它是多维的一样。在最近的另一个 SO 中,我注意到何时reshaping到 (2,2,1,1) 结果仍然是 (2,2)。尾随尺寸 1 尺寸被挤出。

我怀疑这m(:,3)也是结果。

测试 4d MATLAB

>> m=reshape(1:36,2,3,3,2);
>> m(:,:,1)
ans =

   1   3   5
   2   4   6

>> reshape(m,2,3,6)(:,:,1)
ans =

   1   3   5
   2   4   6

>> m(:,17)
ans =

   33
   34

>> reshape(m,2,18)(:,17)
ans =

   33
   34

推荐阅读