索引python 2D列表

时间:2017-04-10 17:17:35

标签: python list numpy indexing

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

A[:,0:9]

我们怎么能这样做到2D列表呢?

2 个答案:

答案 0 :(得分:0)

浪费但应该工作:

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))

答案 1 :(得分:0)

数组和嵌套列表版本:

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