2012-03-21 73 views
1

我想从矩阵中提取出一些指定的列。我矩阵是提取矩阵的可变列数

matrix=[[1,2,3,4,5], 
     [6,7,8,9,10], 
     [6,4,3,1,2], 
     [2,3,4,5,6]] 
expected result: [[3,4],[8,9],[3,1],[4,5]] for 2 columns 
expected result in case of 3 column:[[1,2,3],[6,7,8],[6,4,3],[2,3,4]] 

我试图使用如下方法:

def func(matrix, p): 
    return np.vstack([a[i] for a in matrix]) 

以上方法只是返回是一列,但是我想写这需要在多个列的方法作为输入(例如,3栏的预期结果),我的输入栏数也是不同的。请建议一个合适的方法来提取python中的这些列。

[[a[i] for i in (1, 5, 7)] for a in matrix] 

用法示例您的输入:

回答

3

使用纯Python,你可以使用下面的嵌套列表理解提取51,并且7

>>> [[a[i] for i in (0, 1, 2)] for a in matrix] 
[[1, 2, 3], [6, 7, 8], [6, 4, 3], [2, 3, 4]] 

在这样的地方的情况下你想提取一列真正的切片,你也可以使用列表切片:

>>> [a[0:3] for a in matrix] 
[[1, 2, 3], [6, 7, 8], [6, 4, 3], [2, 3, 4]] 
+0

@ user869790:之前你张贴评论,我已经添加了一个例子您的具体使用情况。索引从Python中的'0'开始(以及我知道的大多数其他编程语言)。不知道你为什么得到4x4矩阵,而不是4x3,这似乎不太可能。 – 2012-03-21 19:57:30

+0

感谢您的帮助:)。我得到一个(4×3)矩阵(如有问题)。我在编辑之前发布了我的评论......因此没有看到它......谢谢大家的帮助:) – 2012-03-21 19:59:32

+0

@user:增加了另一种方式,对于那些需要连续列的特殊情况。 – 2012-03-21 20:23:14

1

如果你喜欢内numpy的工作,你可以用切片:

def col_slice(arr, col_start=None, total_cols=None): 
    """ take a slice of columns from col_start for total_cols """ 
    return arr[:,col_start:col_start + total_cols] 

例子:

In [22]: col_slice(your_matrix, col_start=2, total_cols=2) 
Out[22]: 
array([[3, 4], 
     [8, 9], 
     [3, 1], 
     [4, 5]]) 

In [23]: col_slice(your_matrix, col_start=0, total_cols=3) 
Out[23]: 
array([[1, 2, 3], 
     [6, 7, 8], 
     [6, 4, 3], 
     [2, 3, 4]])