访问matlab矩阵的列及其在numpy中的实现

Accessing columns of matlab matrix and its realization in numpy

我正在尝试找到一种访问 numpy 数组元素的实现,对应于 Matlab 的一个特性。

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

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

尽管这是一个 3 维数组,但 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 一样访问列。

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

我对这个问题的回答如下,假设给定问题中列出的数组

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

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

可以创建一个列表,我称其为 m_list 形式

m_list = [m[i][:,j] for i in range(m.shape[0]) for j in range(m.shape[-1])]

这将以

的形式输出 m_list
m_list = [array([1, 3]), array([2, 4]), array([7, 9]), array([ 8, 10])]

现在我们可以访问 m_list 的元素,就像问题中列出的 Matlab 一样。