【问题标题】:Slice numpy matrix using vectors as indices使用向量作为索引对 numpy 矩阵进行切片
【发布时间】:2013-03-18 04:09:26
【问题描述】:

假设我们有一个大小为 639 x 668 的矩阵 s,这个矩阵完全由 -1 的值组成。我们想要访问和替换 28X28 的一部分(例如,左上角),在该特定子矩阵周围留下 -1 的边框。对于该任务,我们初始化了以下向量 p(在 MATLAB 中),然后访问该部分:

>> s = -ones(639, 668);
>> p = 2:29;
>> section = s(p, p); %Size 28X28
>> size(section)

   ans =

   28    28

现在我们想在 Numpy/Python 中重写该代码,假设切片是等价的:

>>> import numpy as np
>>> s = -np.ones((639, 668))
>>> p = np.arange(1, 29)
>>> section = s[p, p]
>>> section.shape
(1, 28)

在这种情况下,无法使用相同的向量访问相同的部分(请注意,numpy 中的索引基于 0)。 ¿ 可以使用与 MATLAB 中类似的过程访问 numpy 中的该部分吗?

提前致谢。

【问题讨论】:

    标签: python matlab vector matrix numpy


    【解决方案1】:

    您想使用slice notation,如a[1:29,1:29],而不是列表。

    如果需要,您可以使用p = slice(1,29) 创建一个slice 对象以获得更多的matlab 行为。

    In [9]: a = -np.ones((10,10))
    
    In [10]: a
    Out[10]: 
    array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]])
    
    In [11]: a[1:4,1:4] = 9
    
    In [12]: a
    Out[12]: 
    array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
           [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
           [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]])
    
    
    In [13]: p = slice(1,4)
    
    In [14]: a[p,p]
    Out[14]: 
    array([[ 9.,  9.,  9.],
           [ 9.,  9.,  9.],
           [ 9.,  9.,  9.]])
    

    【讨论】:

      【解决方案2】:

      你可以用 slice 对象做你想做的事:

      >>> p = slice(1, 29)
      >>> section = s[p, p]
      >>> section.shape
      (28L, 28L)
      

      通过广播索引数组,您可以获得类似但不同的结果:

      >>> p = np.arange(1, 19)
      >>> section_bis = s[p[:, None], p]
      >>> section_bis.shape
      (28L, 28L)
      

      问题是您现在拥有的是一个副本,而不是原始数组的视图,因为您使用了花哨的索引:

      >>> section_bis[:] = 0
      >>> s
      array([[-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.],
             ..., 
             [-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.]])
      

      但是:

      >>> section[:] = 0
      >>>
      array([[-1., -1., -1., ..., -1., -1., -1.],
             [-1.,  0.,  0., ..., -1., -1., -1.],
             [-1.,  0.,  0., ..., -1., -1., -1.],
             ..., 
             [-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.],
             [-1., -1., -1., ..., -1., -1., -1.]])
      

      【讨论】:

        猜你喜欢
        • 2020-04-28
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 2013-01-06
        • 2015-06-14
        • 1970-01-01
        相关资源
        最近更新 更多