【问题标题】:Make Python 2D masked array similar to MATLAB's制作类似于 MATLAB 的 Python 2D 掩码数组
【发布时间】:2021-08-11 00:40:37
【问题描述】:

我目前正在将 MATLAB 脚本翻译成 python。在 MATLAB 代码中有一个步骤,我需要根据具有相同维度的布尔矩阵从矩阵(二维数组)中选择条目。当我尝试在 Python 中编写等效代码时,我注意到结果数组中的元素与 MATLAB 相比的顺序不同。更准确地说,MATLAB 似乎按列顺序选择元素,而 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])

【问题讨论】:

    标签: python arrays numpy matlab


    【解决方案1】:

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

    a.T[b.T]
    

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

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

    【讨论】:

    • 谢谢!只是为了完成:a.T[b.T] 比 a.flatten('F')[b.flatten('F') 快得多。
    • 是的,转置创建一个视图,而展平返回一个副本,所以它比较慢。
    【解决方案2】:

    先在Python中转置数组a怎么样?

     a.T[b]
    

    【讨论】:

    • 谢谢,我只需要对@bb1 进行修复,因为我正在工作的真实矩阵不是平方的
    • 对,我的回答不能概括为非对称掩码矩阵
    【解决方案3】:

    如果我们将 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 数组重新排序,因此使用 order '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])
    

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2018-05-06
      • 2021-10-02
      相关资源
      最近更新 更多