2014-05-07 101 views
1

所以我希望能够采取矩阵的列,做它想要的操作,然后将它放回我以为matrix.What,是我走的矩阵转置之,对列做了手术,然后它移调我again.For矩阵转置,我有:采取从矩阵的列?

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 

但是,代码不工作,但它确实modifiy行,但不是专栏,有时它根本没有做任何事情。

+0

使用numpy的考虑? – dawg

+0

你有没有示例矩阵?这些稀疏矩阵? – dawg

回答

0

只要这些都不是稀疏矩阵(即每行相同的长度,每一个山坳长度相同,但LEN行并不需要是相同的山坳长度)我想你可能会这样得太多。

假设你想f(x)为x * 10的3×4矩阵的第1栏的每一个元素。

几种方法可以做到这一点。

移调,修改行,转:

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

代替列表理解:

或者,你可以强制牛逼修改矩阵到位与列表理解:

>>> 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的:

如果你想在列数据执行算术,你可以考虑使用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]]) 

或者,如果你想把numpy的版本到同一f(x)类型:

>>> a[:,1]=[f(x) for x in a[:,1]] 

numpy是最快最简单的。它确实有一个学习曲线。