我有一个稀疏矩阵(numpy.array),我希望其中包含非零元素的索引。
在Matlab中我会写:
[i, j] = find(CM)
在Python中我该怎么办? 我试过numpy.nonzero(但我不知道如何从中获取索引)和flatnonzero(但这对我来说不方便,我需要行和列索引)。
提前致谢!
答案 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]))
我们可以将这些内容分配给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]])
(有很多方法可以做这个重塑;我几乎随机选择了一个。)
答案 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])
哪个好又简单。