如何从Numpy矩阵中的每一列获取值

gwg*_*gwg 5 python numpy matrix

我想得到矩阵中每列的值索引M.例如:

M = matrix([[0, 1, 0],
            [4, 2, 4],
            [3, 4, 1],
            [1, 3, 2],
            [2, 0, 3]])
Run Code Online (Sandbox Code Playgroud)

在伪代码中,我想做这样的事情:

for col in M:
    idx = numpy.where(M[col]==0) # Only for columns!
Run Code Online (Sandbox Code Playgroud)

和有idx0,4,0对于每一列.

我试过使用where,但我不理解返回值,这是一个矩阵元组.

sen*_*rle 3

矩阵元组是适合索引的项目的集合。输出将具有索引矩阵(或数组)的形状,输出中的每个项目都将从原始数组中选择,使用第一个数组作为第一维的索引,第二个数组作为第二维的索引,等等。换句话说,这个:

>>> numpy.where(M == 0)
(matrix([[0, 0, 4]]), matrix([[0, 2, 1]]))
>>> row, col = numpy.where(M == 0)
>>> M[row, col]
matrix([[0, 0, 0]])
>>> M[numpy.where(M == 0)] = 1000
>>> M
matrix([[1000,    1, 1000],
        [   4,    2,    4],
        [   3,    4,    1],
        [   1,    3,    2],
        [   2, 1000,    3]])
Run Code Online (Sandbox Code Playgroud)

这个顺序可能会让你感到困惑。它以扁平化的顺序进行——因此M[0,2]出现在第二位,而不是第三位。如果您需要重新排序,您可以这样做:

>>> row[0,col.argsort()]
matrix([[0, 4, 0]])
Run Code Online (Sandbox Code Playgroud)

您还可能最好使用数组而不是矩阵。这样你就可以操纵数组的形状,这通常很有用!另请注意ajcr的基于转置的技巧,这可能比使用 更好argsort

最后,还有一种方法可以完成与本例nonzero相同的操作。where现在使用转置技巧:

>>> (M == 0).T.nonzero()
(matrix([[0, 1, 2]]), matrix([[0, 4, 0]]))
Run Code Online (Sandbox Code Playgroud)