从矩阵中取一列?

时间:2014-05-07 23:26:51

标签: python python-3.x matrix position selection

所以我希望能够获取一个矩阵的列,对它进行想要的操作,然后将它放回矩阵中。我想,是我取矩阵,转置它,对列进行操作,然后再转置它。对于我的矩阵换位,我有:

 def transpose(matrix):

     return list(map(list, zip_longest(*matrix, fillvalue=0)))

然后我的功能是管理列,我试过了:

def gestion_colonne(matrix):
    matrix = transpose(matrix) 
    print(matrix)  # to see if the matrix was transposed
    column = int(input('wich column to modify?'))
    alist = matrix[column-1]
    list_manage(alist) #send the column to the menu that do operation on it(ex:reverse it,sort it...)
    matrix =  list(map(list, zip_longest(*matrix, fillvalue=0))) #transpose again to row turn to initial column

然而,代码不起作用,它确实修改了一行,但没有修改列,有时它根本不做任何事情。

1 个答案:

答案 0 :(得分:0)

只要这些不是稀疏矩阵(即每行的长度与每个相同的长度相同,但len行不需要与col长度相同),我想你可能会过度思考这个问题。

假设您希望{3}对于3x4矩阵的col 1中的每个元素都是{* 1}}。

有几种方法可以做到。

转置,修改行,转置:

f(x)

打印:

# our matrix
matrix=[
         [1,2,3],
         [4,5,6],
         [7,8,9],
         [10,11,12]   
        ]
# our function
def f(x): return x*10       

# transpose 3x4 to 4x3
T=list(zip(*matrix))   
print('{}\n\ttransposed:\n{}'.format(matrix, T))

# modify row in question
T[1]=tuple(f(x) for x in T[1])

# show transposed back matrix vs original matrix
print('{}\n\t col modified:\n{}'.format(matrix, [list(row) for row in zip(*T)]))    

到位列表理解:

或者,您可以使用列表解析来修改矩阵:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    transposed:
[(1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
     col modified:
[[1, 20, 3], [4, 50, 6], [7, 80, 9], [10, 110, 12]]

<强> numpy的:

如果你想对柱状数据进行算术运算,你可以考虑使用numpy,它可以做到这一点,而无需在每个元素上进行转置或循环:

>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>> matrix=[[f(x) if i==1 else x for i, x in enumerate(sl)] for sl in matrix]
>>> matrix
[[1, 20, 3], [4, 50, 6], [7, 80, 9], [10, 110, 12]]

或者,如果您想将numpy版本放入相同的>>> import numpy as np >>> a=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) >>> a array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) >>> a[:,1]*=10 >>> a array([[ 1, 20, 3], [ 4, 50, 6], [ 7, 80, 9], [ 10, 110, 12]]) 类型:

f(x)

Numpy是最快最简单的。它确实有学习曲线。