制作类似于 MATLAB 的 Python 二维掩码数组

Make Python 2D masked array similar to MATLAB's

我目前正在将 MATLAB 脚本翻译成 python。在 MATLAB 代码中有一个步骤,我需要 select 基于具有相同维度的布尔矩阵的矩阵(二维数组)中的条目。当我尝试在 Python 中编写等效代码时,我注意到结果数组中的元素与 MATLAB 中的顺序不同。更准确地说,MATLAB 似乎 select 元素按列顺序排列,Python 按行顺序排列。有没有办法让 Python 以 MATLAB 顺序输出数组?

小例子:

MATLAB:

a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
b = [false, false, true; false, false, false; true, false, false];
a(b) % outputs [7;3] or [a(3,1); a(1,3)]

PYTHON:

import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
b= np.array([[False, False, True], [False, False, False], [True, False, False]]))
a[b] # outputs array([3,7]) or array([a[0,2], a[2,0])

先将数组 a 转置到 Python 中如何?

 a.T[b]

扩展 Mikhail Genkin 的答案,可以使用

a.T[b.T]

a.T[b] 在这种特殊情况下给出相同的结果,因为 b 是对称矩阵)。另一种选择是

a.flatten('F')[b.flatten('F')]

如果我们展平 MATLAB 矩阵:

>> a(:)
ans =

   1
   4
   7
   2
   5
   8
   3
   6
   9

>> b(:)
ans =

  0
  0
  1
  0
  0
  0
  1
  0
  0

选择变得更加明显。

>> a(b)
ans =

   7
   3

a.Tnumpy 数组重新排序,使用顺序 'F' 也是如此(这是 matlab 使用的)

In [112]: a=np.arange(1,10).reshape(3,3,order='F')
In [113]: a
Out[113]: 
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
In [114]: a[b]
Out[114]: array([7, 3])

numpy默认为'C'顺序;最后一个维度变化很快。在两者之间进行转换时,我们需要牢记顺序差异。

或者转置后看元素顺序:

In [126]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [127]: a
Out[127]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [128]: a.T.ravel()
Out[128]: array([1, 4, 7, 2, 5, 8, 3, 6, 9])