首页 > 解决方案 > 是否可以在 python 中切片多维列表(不是 numpy)?

问题描述

这个问题与这个问题相同,但针对的是原生 python 列表。

假设如下:

import numpy as np
a = np.ones((5, 6, 7))
a_list = a.tolist()

我可以a像这样切片:

a_slice = a[2:4, 4:, :3]

以某种方式同样可能a_list吗?


问的原因是我得到一个嵌套列表流,例如a_list,只想保存流的一部分以供以后使用。
我不想为此通过一个 numpy 数组,因为它每次都会分配内存,这是非常次优的。
我正在寻找一种方法来实现这一点。


编辑 shivam_Jha

import numpy as np
a = np.ones((5, 6, 7))
a_list = a.tolist()
a_list
Out[20]: 
[[[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
 [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
 [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
 [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]],
 [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
  [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]]]

期待输出

a[2:4, 4:, :3].tolist()
Out[21]: [[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]], [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]]

标签: pythonarrayslistnumpyslice

解决方案


In [65]: a = np.ones((5,6,7),int)
In [66]: alist = a.tolist()
In [67]: len(alist)
Out[67]: 5
In [68]: a[2:4, 4:, :3].shape
Out[68]: (2, 2, 3)
In [69]: np.array(alist[2:4]).shape
Out[69]: (2, 6, 7)
In [70]: np.array([a1 for a1 in alist[2:4]]).shape
Out[70]: (2, 6, 7)
In [71]: np.array([a1[4:] for a1 in alist[2:4]]).shape
Out[71]: (2, 2, 7)
In [72]: np.array([[a2[:3] for a2 in a1[4:]] for a1 in alist[2:4]]).shape
Out[72]: (2, 2, 3)

推荐阅读