【问题标题】:Most concise way to get complementary slice in numpy在 numpy 中获取互补切片的最简洁方法
【发布时间】:2020-01-21 17:09:47
【问题描述】:

给出numpy.array 切片的补码的最简洁(紧凑)方式是什么?与previous post 相反,我没有考虑速度,但考虑到易用性/可读性/通用性。

以数组A=np.array([1,2,3,4,5,6])为例。我正在寻找 A[start:stop] 的补码,例如,A[2:4] 的补码是 "comp of A[2:4]"=array([1,2,3,6])。我正在寻找一种无论内容类型如何都有效的解决方案。所以 A 也可以包含数组 str 并且原则上理想地是正常 [start:stop] 切片操作也适用的任何维度。

不说一般性,这是我目前使用的:

def comp(A,start,stop):
    if A.ndim == 1:
        out = np.hstack((A[0:start],A[stop:]))
    else:
        out = np.vstack((A[0:start],A[stop:]))
    return out

【问题讨论】:

  • 你不是在看设置差异吗:np.array(list(set(A) - set(A[2:4])))

标签: python numpy slice


【解决方案1】:

这是使用np.r_ 生成这些索引然后索引到输入数组的一种简洁方法 -

A[np.r_[:start,stop:len(A)]]

【讨论】:

    【解决方案2】:

    @Divakar 提出的r_ 解决方案是numpy 的简洁解决方案,但不会推广到其他类。

    In [195]: np.r_[0:2,4:6]                                                                         
    Out[195]: array([0, 1, 4, 5])
    

    它会生成一个您想要保留的索引列表,基本上是concatenatenp.arange(0,2)np.arange(4,6)。列表索引是advanced indexing,它会生成一个副本。

    您不能使用这样的列表来索引 Python liststring。它们只能索引元素。要在列表中使用它:

    [alist[i] for i in np.r_[0:2,4:6]]
    

    但列表有一个删除语法alist[2:4]=[]

    字符串没有这个,因为它们是不可变的。

    更通用的方法是连接/连接两个切片

    np.concatenate([arr[0:2], arr[4:6]])
    alist[0:2] + alist[4:6]
    astr[0:2] + astr[4:6]
    np.concatenate([arr[:, 0:2], arr[:, 4:6]], axis=1)
    

    您的hstack/vstack 代码可以与

    合二为一
    np.concatenate((A[0:start],A[stop:]),axis=0)
    

    因为您在这两种情况下都在第一个维度上加入切片。

    二维切片的补码:

    arr[2:4, 2:4]
    

    不能是二维数组。每行留下不同数量的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2022-01-21
      • 2017-02-09
      • 2010-09-18
      • 1970-01-01
      • 2019-01-07
      • 2016-07-15
      相关资源
      最近更新 更多