从矩阵中提取一列?
我想从一个矩阵中取出一列,进行一些操作后再把它放回去。我想到的方法是先把矩阵转置一下,操作完那一列后再转置回来。关于矩阵转置,我写了:
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
只要这些不是稀疏矩阵(也就是说,每一行的长度都和其他行一样,每一列的长度也都一样,但行的长度不需要和列的长度相同),我觉得你可能想得太复杂了。
假设你想要 f(x)
在一个3行4列的矩阵的第一列中,每个元素都变成 x*10。
有几种方法可以做到这一点。
转置矩阵,修改行,再转置回来:
# 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是最快和最简单的方法。不过,它确实需要一些学习时间。