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

时间:2014-12-15 16:30:28

标签: python numpy matrix

我希望得到矩阵M中每列的值索引。例如:

M = matrix([[0, 1, 0],
            [4, 2, 4],
            [3, 4, 1],
            [1, 3, 2],
            [2, 0, 3]])

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

for col in M:
    idx = numpy.where(M[col]==0) # Only for columns!

并且每列都有idx04

我尝试使用0,但我不理解返回值,这是一个矩阵元组。

5 个答案:

答案 0 :(得分: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]])

序列可能让你感到困惑。它以扁平的顺序进行 - 因此M[0,2]显示为第二,而不是第三。如果您需要重新排序,可以这样做:

>>> row[0,col.argsort()]
matrix([[0, 4, 0]])

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

最后,在这种情况下,还有nonzero方法与where做同样的事情。现在使用转置技巧:

>>> (M == 0).T.nonzero()
(matrix([[0, 1, 2]]), matrix([[0, 4, 0]]))

答案 1 :(得分:2)

作为np.where的替代方法,您可以使用np.argwhere返回数组满足条件的索引数组:

>>> np.argwhere(M == 0)
array([[[0, 0]],

       [[0, 2]],

       [[4, 1]]])

这将告诉您每个符合条件[row, column]的索引。

如果您希望此输出数组的格式按列而不是行(即[column, row])进行分组,只需在数组的转置上使用该方法:

>>> np.argwhere(M.T == 0).squeeze()
array([[0, 0],
       [1, 4],
       [2, 0]])

我在这里也使用了np.squeeze来摆脱轴1,因此我们留下了一个2D数组。您想要的序列是第二列,即np.argwhere(M.T == 0).squeeze()[:, 1]

答案 2 :(得分:0)

where(M == 0)的结果看起来像这样

(matrix([[0, 0, 4]]), matrix([[0, 2, 1]]))第一个矩阵会告诉您0所在的行,第二个矩阵会告诉您0所在的列。

Out[4]: 
matrix([[0, 1, 0],
        [4, 2, 4],
        [3, 4, 1],
        [1, 3, 2],
        [2, 0, 3]])

In [5]: np.where(M == 0)
Out[5]: (matrix([[0, 0, 4]]), matrix([[0, 2, 1]]))

In [6]: M[0,0] 
Out[6]: 0

In [7]: M[0,2] #0th row 2nd column
Out[7]: 0

In [8]: M[4,1] #4th row 1st column
Out[8]: 0

答案 3 :(得分:0)

对于已经建议的内容,这并不是什么新鲜事,但是单线解决方案是:

>>> np.where(np.array(M.T)==0)[-1]
array([0, 4, 0])

(我同意NumPy matrix对象比他们的价值更麻烦。

答案 4 :(得分:0)

>>> M = np.array([[0, 1, 0],
...             [4, 2, 4],
...             [3, 4, 1],
...             [1, 3, 2],
...             [2, 0, 3]])
>>> [np.where(M[:,i]==0)[0][0] for i in range(M.shape[1])]
[0, 4, 0]