2017-04-25 108 views
0

我有一個numpy.ndarray,並且想要刪除第一個h元素和最後一個t。從numpy數組中刪除頭部和尾部PYTHON

正如我看到的,更一般的方法是選擇:

h, t = 1, 1 
my_array = [0,1,2,3,4,5] 
middle = my_array[h:-t] 

和中間是[1,2,3,4]。這是正確的,但是當我不想刪除任何東西時,我使用h = 0和t = 0,因爲我試圖刪除任何東西,但是這會返回空數組。我知道這是因爲t = 0,我也知道這個邊界情況下的if條件可以用my_array [h:]來解決,但我不想要這個解決方案(我的問題稍微複雜一點,更多維度,代碼將變得難看)

任何想法?

回答

1

相反,使用

middle = my_array[h:len(my_array)-t] 

爲了完整起見,這裏的試運行:

my_array = [0,1,2,3,4,5] 
h,t = 0,0 
middle = my_array[h:len(my_array)-t] 
print(middle) 

Output: [0, 1, 2, 3, 4, 5] 

這個例子只是一個標準的數組。由於您的最終目標是使用numpy多維數組,所以這個問題實際上有點棘手。當你說你想刪除第一個h元素和最後一個t元素時,我們保證ht滿足適當的可分性標準,以便結果是一個格式良好的數組?

我實際上認爲最簡潔的解決方案就是使用這個解決方案,但首先要用適當的因子進行劃分。例如,在兩個維度:

h = 3 
t = 6 
a = numpy.array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12]]) 

d = numpy.prod(numpy.shape(a)[1:]) 
mid_a = a[int(h/3):int(len(a)-t/3)] 
print(mid_a) 

Output: array([[4, 5, 6]]) 

我已經包括INT中的索引蒙上因爲蟒3自動促進分裂浮動,即使當分子整除分母。

+1

雖然您在處理多維數組時必須小心。我更喜歡用'my_array.size'而不是'len(my_array)' – kmario23

+0

好,我會測試並編輯我的答案。謝謝。 – Apollys

1

i:j可以替換爲slice對象。和':j'slice(None,j)等:

In [55]: alist = [0,1,2,3,4,5] 
In [56]: h,t=1,-1; alist[slice(h,t)] 
Out[56]: [1, 2, 3, 4] 
In [57]: h,t=None,-1; alist[slice(h,t)] 
Out[57]: [0, 1, 2, 3, 4] 
In [58]: h,t=None,None; alist[slice(h,t)] 
Out[58]: [0, 1, 2, 3, 4, 5] 

這適用於列表和數組。對於多維數組,使用索引元組,可以包含切片對象

x[i:j, k:l] 
x[(slice(i,j), Ellipsis, slice(k,l))]