所以我希望能够获取一个矩阵的列,对它进行想要的操作,然后将它放回矩阵中。我想,是我取矩阵,转置它,对列进行操作,然后再转置它。对于我的矩阵换位,我有:
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
然而,代码不起作用,它确实修改了一行,但没有修改列,有时它根本不做任何事情。
答案 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是最快最简单的。它确实有学习曲线。