matlab中的find()用于python中的非零元素

时间:2013-09-26 15:39:20

标签: python arrays matlab numpy

我有一个稀疏矩阵(numpy.array),我希望其中包含非零元素的索引。

在Matlab中我会写:

[i, j] = find(CM)

在Python中我该怎么办? 我试过numpy.nonzero(但我不知道如何从中获取索引)和flatnonzero(但这对我来说不方便,我需要行和列索引)。

提前致谢!

2 个答案:

答案 0 :(得分:3)

假设通过"稀疏矩阵"你实际上并不是指一个scipy.sparse矩阵,而只是一个非零条目相对较少的numpy.ndarray,我认为nonzero正是你正在寻找的。从数组开始:

>>> a = (np.random.random((5,5)) < 0.10)*1
>>> a
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1],
       [0, 0, 1, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

nonzero返回非零条目所在的索引(此处为x和y):

>>> a.nonzero()
(array([1, 2, 3]), array([4, 2, 0]))

我们可以将这些内容分配给ij

>>> i, j = a.nonzero()

我们也可以使用它们将索引回a,这应该只给我们1 s:

>>> a[i,j]
array([1, 1, 1])

我们甚至可以使用以下索引修改a

>>> a[i,j] = 2
>>> a
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 2],
       [0, 0, 2, 0, 0],
       [2, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

如果你想要索引的组合数组,你也可以这样做:

>>> np.array(a.nonzero()).T
array([[1, 4],
       [2, 2],
       [3, 0]])

(有很多方法可以做这个重塑;我几乎随机选择了一个。)

答案 1 :(得分:0)

这稍微超出了你的范围,我只提到它,因为我曾遇到过类似的问题。如果您希望索引访问其他一些数组,则会有一些非常简单的sytax:

import numpy as np

array = np.random.randint(0, 2, size=(3, 3))

data = np.random.random(size=(3, 3))

现在数组看起来像

>>> print array
array([[0, 1, 0],
       [1, 0, 1],
       [1, 1, 0]])

虽然数据可能

>>> print data
array([[ 0.92824816,  0.43605604,  0.16627849],
       [ 0.00301434,  0.94342538,  0.95297402],
       [ 0.32665135,  0.03504204,  0.86902492]])

然后,如果我们想要零的数据元素:

>>> print data[array==0]
array([ 0.92824816,  0.16627849,  0.94342538,  0.86902492])

哪个好又简单。