Python-numpy.nonzero用法


numpy.nonzero的功能是返回数组中所有非零元素的索引,比如在聚类分析中有这么一段更新质心位置的代码,cluster是每一行数组所属质心的索引,质心一共有k个,如何分别得到每个质心下的全部索引呢?一行nonzero(index == cent)就可以轻松解决问题。

1
2
3
4
5
6
# 更新质心的位置,直到簇分配结果不再改变为止
for cent in range(k):
index = cluster[:, 0].A # 簇分配结果中的所有索引
value = nonzero(index == cent)
sample_in_cent = dataset[value[0]]
centroids[cent, :] = mean(sample_in_cent, axis=0) # 按列计算均值

举个例子加深理解

1
2
3
4
5
6
7
8
9
>>> x = np.eye(3)
>>> x
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
# 数组x中共有3个非零元素,nonzero则分别返回非零元素的行、列坐标
# 如第1行第1列,第2行第2列,第3行第3列
>>> np.nonzero(x)
(array([0, 1, 2]), array([0, 1, 2]))

当然也可以使用numpy.nonzero直接获取数组中的所有非零元素值

1
2
3
4
5
6
7
8
# 返回x中所有的非零元素
>>> x[np.nonzero(x)]
array([ 1., 1., 1.])
# 如果觉得返回的结果不方便阅读,还可以将它转置一下
>>> np.transpose(np.nonzero(x))
array([[0, 0],
[1, 1],
[2, 2]])

不仅仅是快速查找数组内的非零元素,numpy.nonzero还可以用来返回特定条件下的元素索引。比如给定一个数组a,查找数组a中符合大于3条件的元素,使用numpy.nonzero则会返回所有符合条件的元素索引。

1
2
3
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> np.nonzero(a > 3)
(array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))

也可以这样用

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

参考

  1. numpy.nonzero
觉得还不错?帮我赞助点域名费吧:)