簡體   English   中英

在 numpy 中獲取互補切片的最簡潔方法

[英]Most concise way to get complementary slice in numpy

給出numpy.array切片的補充的最簡潔(緊湊)方法是什么? 之前的帖子相反,我沒有考慮速度,但考慮到易用性/可讀性/通用性。

以數組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.r_生成這些索引然后索引到輸入數組的一種簡潔方法 -

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

@Divakar提出的r_解決方案是一個簡潔的numpy解決方案,但它不會推廣到其他類。

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

它生成一個你想要保留的索引列表,本質上是concatenate np.arange(0,2)np.arange(4,6) 使用列表進行advanced indexingadvanced 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]

不能是二維數組。 每行留下不同數量的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM