在Python中切片列表:有类似-0的内容吗?

时间:2016-10-28 08:00:50

标签: python arrays numpy list-comprehension

我有一个3D阵列,并希望将其分成许多子卷。 到目前为止,这是我的代码:

# 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]

我知道通常的答案,只需删除上限,就像这样:arr[crop:, :, :]。通常这很方便。但是我如何在列表理解中做到这一点?

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:2)

使用if..else三元None

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