【问题标题】:Is it possible to slice multidimensional LISTS (not numpy) in python?是否可以在 python 中切片多维列表(不是 numpy)?
【发布时间】:2020-12-24 23:29:57
【问题描述】:

此问题与this one 相同,但针对的是原生 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]]]

【问题讨论】:

  • 你能举个例子吗,请列出一个列表,并显示你的预期输出?
  • 列表理解不是很好,是的,类似于stackoverflow.com/questions/40852575/…
  • 您将得到的所有答案都是嵌套列表推导的某个版本。
  • 在原始 python 中没有像多维索引那样的numpy。因此,您必须在维度之后访问列表维度

标签: python arrays list numpy slice


【解决方案1】:

也许这就是你想要的:

listD = [
    [
        [
            [53, 54], [129, 130]
        ]
    ],
    [
        [
            [51, 51], [132, 132]
        ]
    ],
    [
        [
            [39, 39], [144, 144]
        ],
        [
            [53, 54], [129, 130]
        ]
    ],
    [
        [
            [39, 39], [146, 146]
        ],
        [
            [54, 54], [130, 130]
        ]
    ],
    [
        [
            [54, 53], [130, 129]
        ]
    ],
    [
        [
            [52, 52], [132, 132]
        ]
    ]
]

newList = [[item[0]] for sub_list in listD for item in sub_list]

print(newList)

输出: [[[53, 54]], [[51, 51]], [[39, 39]], [[53, 54]], [[39, 39]], [[54, 54]], [[54, 53]], [[52, 52]]]

如果你这样做: newList = [item[0] for sub_list in listD for item in sub_list] 它给了我: [[53, 54], [51, 51], [39, 39], [53, 54], [39, 39], [54, 54], [54, 53], [52, 52]]

【讨论】:

  • 复制粘贴其他答案是不受欢迎的。这没有回答问题,没有给予信任,并且完全不相关。
  • 嘿,我尝试了自己的逻辑,答案匹配是巧合。我格式化列表,检查它,然后编写代码并编写输出。如果你愿意,我可以给你解释逻辑。
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2011-05-12
    • 2016-07-15
    • 2021-11-23
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多