1

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

在 Matlab 中,我会写:

[i, j] = find(CM)

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

提前致谢!

4

2 回答 2

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,这应该只给我们1s:

>>> 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]])

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

于 2013-09-26T15:46:32.363 回答
0

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

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])

这很好很简单。

于 2013-09-26T15:57:12.027 回答