我希望得到矩阵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!
并且每列都有idx
,0
,4
。
我尝试使用0
,但我不理解返回值,这是一个矩阵元组。
答案 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]