【问题标题】:Accessing columns of matlab matrix and its realization in numpy访问matlab矩阵的列及其在numpy中的实现
【发布时间】:2021-09-04 14:13:28
【问题描述】:

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

假设在表格中给定一个(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 方式访问列。

【问题讨论】:

  • 你试过什么?你有没有花时间阅读任何 numpy 文档。我相信对于任性的 MATLAB 用户来说,有一个快速表格。
  • 嗨@hpaulj,到目前为止,我还没有找到这种羽毛的快速numpy实现。到目前为止,我想出的只是尝试将 numpy 数组重新排列为 [np.array([1,3]),np.array([2,4]),...] 形式的列表(或数组),以便可以像 matlab 一样访问列。
  • 我希望 numpy 确实有这样的羽毛。在实践中非常方便。
  • 你尝试过a[0]、a[:,0]、a[:,:,0]之类的东西吗?
  • 是的,这是访问 numpy 数组列的最自然的方式。但不幸的是,这不是我想要的。

标签: python numpy matlab


【解决方案1】:

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

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])]

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

【讨论】:

    【解决方案2】:
    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 最初是严格二维的。然后在 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
    

    【讨论】:

    • 这是最自然的访问 numpy 数组列的方式。但不是我正在寻找的功能。我希望,就像在 matlab 案例中一样,我可以以二维方式访问列。我可以使用 0,1,2,3 或 1,2,3,4 之类的数字来直接访问列。
    • 但这不可能以这种最自然的方式。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多