从矩阵中提取一列?

1 投票
1 回答
567 浏览
提问于 2025-04-18 05:45

我想从一个矩阵中取出一列,进行一些操作后再把它放回去。我想到的方法是先把矩阵转置一下,操作完那一列后再转置回来。关于矩阵转置,我写了:

 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是最快和最简单的方法。不过,它确实需要一些学习时间。

撰写回答