我有一个稀疏矩阵(numpy.array),我想在其中包含非零元素的索引。
在 Matlab 中,我会写:
[i, j] = find(CM)
在 Python 中我该怎么办?我已经尝试过 numpy.nonzero (但我不知道如何从中获取索引)和 flatnonzero (但这对我来说不方便,我需要行和列索引)。
提前致谢!
假设“稀疏矩阵”实际上并不是指一个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]))
我们可以将它们分配给i
和j
:
>>> 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]])
(有很多方法可以进行这种重塑;我几乎随机选择了一种。)
这稍微超出了你的范围,我只提到它,因为我曾经遇到过类似的问题。如果您希望索引访问其他数组,则有一些非常简单的语法:
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])
这很好很简单。