【问题标题】:summation of sub-matrices of boolean numpy arrays布尔 numpy 数组的子矩阵的求和
【发布时间】:2017-05-07 20:18:19
【问题描述】:

我有一个11x51 布尔矩阵a。为此,我在 Matlab 中执行此操作以获得大小为 10x50 的布尔矩阵。

a = logical(a(1:end-1,1:end-1) + a(2:end,1:end-1) + a(1:end-1,2:end) + a(2:end,2:end))

我想在 python 中执行此操作。我试过这个:-

a = np.zeros([11,51], dtype=bool)
a=a[0:-2,0:-2] + a[1:-1,0:-2] + a[0:-2,1:-1] + a[1:-1,1:-1]

我最终得到了9x49 矩阵,但我不确定它是否正在执行预期的操作。

谁能指出错误?

【问题讨论】:

  • [:-2] 将删除两个元素

标签: python arrays matlab numpy matrix


【解决方案1】:

使用slicing,它将是-

a_out = (a[:-1,:-1] + a[1:,:-1] + a[:-1,1:] + a[1:,1:]).astype(bool)

由于a 已经是一个布尔数组,我们可以跳过bool 的转换。

在 MATLAB 上运行示例 -

>> a = logical([
    1, 1, 0, 1, 1, 0
    0, 1, 0, 0, 0, 0
    1, 1, 0, 1, 1, 1
    0, 0, 0, 0, 1, 0
    0, 0, 1, 0, 1, 1
    0, 0, 0, 1, 1, 0]);
>> a(1:end-1,1:end-1) + a(2:end,1:end-1) + a(1:end-1,2:end) + a(2:end,2:end)
ans =
     3     2     1     2     1
     3     2     1     2     2
     2     1     1     3     3
     0     1     1     2     3
     0     1     2     3     3
>> logical(a(1:end-1,1:end-1) + a(2:end,1:end-1) + ...
           a(1:end-1,2:end)   + a(2:end,2:end))
ans =
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     0     1     1     1     1
     0     1     1     1     1

在 NumPy 上运行示例 -

In [160]: a  # Same data as in MATLAB sample
Out[160]: 
array([[ True,  True, False,  True,  True, False],
       [False,  True, False, False, False, False],
       [ True,  True, False,  True,  True,  True],
       [False, False, False, False,  True, False],
       [False, False,  True, False,  True,  True],
       [False, False, False,  True,  True, False]], dtype=bool)

In [161]: (a[:-1,:-1] + a[1:,:-1] + a[:-1,1:] + a[1:,1:])
Out[161]: 
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True],
       [False,  True,  True,  True,  True]], dtype=bool)

【讨论】:

    【解决方案2】:

    python 中的切片与 Matlab 有点不同。在 Python 中尝试这些:

    除最后一个元素之外的所有元素:

    [:-1]
    

    除第一个元素外的所有元素:

    [1:]    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2019-10-08
      • 2023-03-16
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多