python 2D列表的索引

问题描述:

为了访问2D numpy数组的第二维,我们可以使用例如python 2D列表的索引

A[:,0:9] 

我们怎么能这样对一个二维表?

+3

Python列表真的没有像'numpy'阵列做的尺寸。真的没有“2D列表”。你必须自己编写逻辑,不过,使用切片和列表理解的组合应该相对简单。 –

+2

坚持阵列。尽管表面相似,列表和阵列的工作方式却非常不同。 – user2357112

数组和嵌套列表版本:

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使用tuple(obj[i] for i in items)产生的元组。

奇怪的是,itemgetter返回的元组的列表索引,并列出了片:

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

浪费,但应该工作:

list(zip(*(list(zip(*A))[0:9]))) 

稍微更经济的使用itertools.isclice

list(zip(*(itertools.islice(zip(*A), 0, 9)))) 

或者人们可以使用mapoperator.itemgetter

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

它似乎过度设计给我。只需一个简单的'[sub [0:9] for sub in A]'很好地工作:它是有效的和可读的。 –

+0

@ juanpa.arrivillaga够公平的。 –

+0

最后,我不确定效率在这里是否重要......如果OP想要高效的多维切片,他们应该使用numpy! –