python2d列表的索引

python2d列表的索引,python,list,numpy,indexing,Python,List,Numpy,Indexing,为了访问2D numpy阵列的第二维度,我们可以使用 A[:,0:9] 我们如何才能对二维列表执行此操作?浪费,但应该可以: list(zip(*(list(zip(*A))[0:9]))) 使用itertools.isclice略为经济: list(zip(*(itertools.islice(zip(*A), 0, 9)))) 或者可以使用map和操作符。itemgetter: list(map(operator.itemgetter(slice(0,9)), A)) 数组和嵌套列表

为了访问2D numpy阵列的第二维度,我们可以使用

A[:,0:9]

我们如何才能对二维列表执行此操作?

浪费,但应该可以:

list(zip(*(list(zip(*A))[0:9])))
使用itertools.isclice略为经济:

list(zip(*(itertools.islice(zip(*A), 0, 9))))
或者可以使用
map
操作符。itemgetter

list(map(operator.itemgetter(slice(0,9)), A))

数组和嵌套列表版本:

In [163]: A=np.arange(12).reshape(3,4)
In [164]: Al = A.tolist()
对于切片索引,列表理解(或等效映射)可以正常工作:

In [165]: A[:,1:3]
Out[165]: 
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])
In [166]: [l[1:3] for l in Al]
Out[166]: [[1, 2], [5, 6], [9, 10]]
对于高级索引,列表需要进一步迭代:

In [167]: A[:,[0,2,3]]
Out[167]: 
array([[ 0,  2,  3],
       [ 4,  6,  7],
       [ 8, 10, 11]])

In [169]: [[l[i] for i in [0,2,3]] for l in Al]
Out[169]: [[0, 2, 3], [4, 6, 7], [8, 10, 11]]
此外,还有各种映射备选方案

In [171]: [operator.itemgetter(0,2,3)(l) for l in Al]
Out[171]: [(0, 2, 3), (4, 6, 7), (8, 10, 11)]
itemgetter
使用
元组(obj[i]表示项目中的i)
生成这些元组

奇怪的是,
itemgetter
返回列表索引的元组,以及切片的列表:

In [176]: [operator.itemgetter(slice(1,3))(l) for l in Al]
Out[176]: [[1, 2], [5, 6], [9, 10]]

Python列表实际上没有像
numpy
数组那样的维度。实际上没有“2D列表”。您必须自己编写逻辑,尽管使用切片和列表理解的组合应该相对简单。请坚持使用数组。尽管列表和数组在表面上有相似之处,但它们的工作方式却大不相同。在我看来,这似乎是设计过度了。只需一个简单的
[sub[0:9]就可以很好地使用a]
中的sub了:它既高效又可读。@juanpa.arrivillaga足够公平。最后,我不确定这里的效率是否重要。。。如果OP想要高效的多维切片,他们应该使用numpy@juanpa.arrivillaga如果您的解决方案更快,我一点也不会感到惊讶。切片可以处理列表好的,需要额外帮助的是列表索引,例如
itemgetter
,它只是一个用于列表理解的类包装器。