2016-10-28 65 views
4

我已經有了一個3D數組,並且想將它分成許多子卷。 這是我到目前爲止的代碼:在Python中切片清單:有沒有像-0的東西?

# this results in a 3D array 
arr = trainMasks[0, 0, :, :, :] 
crop = 3 
arrs = [arr[x:-(crop - x), y:-(crop - y), z:-(crop - z)] 
     for x in range(crop + 1) 
     for y in range(crop + 1) 
     for z in range(crop + 1)] 
  • 如果我使用x in range(crop)x只上升到crop - 1,在x維度中的最後一項是老是掉線
  • 如果我使用x in range(crop+1)x它去高達crop,這將導致切片arr[crop:-0, ...]它具有形狀[0, y_dim, z_dim]

我知道usua l答案,只需降低上限,如下所示:arr[crop:, :, :]。通常這很方便。但是我如何在列表理解中做到這一點?

+0

是的,有這樣的事情作爲陰性和陽性零>>> np.NZERO -0.0 >>> np.PZERO 0.0 >>> np.NZERO >> np.NZERO == np.PZERO True不是你期望的,而是用於表示數字。還有NaN和Infinity變種以及 – NaN

回答

5

在這樣最好是避免負面指標的情況。

請注意,對於i>0a[-i]相當於a[len(a)-i]。但就你而言,你還需要爲i==0工作。

這工作:

d1, d2, d3 = arr.shape 
arrs = [arr[ x : d1-(crop-x), y : d2-(crop-y), z : d3-(crop-z)] 
     for x in range(crop + 1) 
     for y in range(crop + 1) 
     for z in range(crop + 1)] 
2

使用三元if..elseNone

>>> 'abc'[:None if 1 else -1] 
'abc' 
>>> 'abc'[:None if 0 else -1] 
'ab' 
+0

非常有趣。我不知道沒有可能作爲一個指標。我會接受其他答案,因爲它有點乾淨,但非常感謝這個洞察力 – lhk

+0

太簡單了!我不知道你可以在'list [None:None]'中使用'None'。我認爲它僅限於整數。 – KeyWeeUsr