numpy中的nonzero()函数详解

np.nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数。
nonzero(a)
返回数组a中非零元素的索引值数组。

(1)只有a中非零元素才会有索引值,那些零值元素没有索引值;
(2)返回的索引值数组是一个2维tuple数组,该tuple数组中包含一维的array数组。其中,一维array向量的个数与a的维数是一致的。
(3)索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果a是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值。
(4) 该np.transpose(np.nonzero(x))
函数能够描述出每一个非零元素在不同维度的索引值。
(5)通过a[nonzero(a)]得到所有a中的非零值
简单来说,nonzero()函数就是返回array当中非零元素的索引,如果该array是一维的,那么返回的就是一个一维数组,里面的元素就是其中非零元素的索引,如果该数组是二维的,那么返回的就是一个二维数组,其中第一维对应的就是其中非零元素索引的第一维,第二维就是其中非零元素索引的第二维。
再简单来说,如果数组a是一个二维数组,那么nonzero()返回的就是一个二维数组,然后把这个数组写成矩阵形式的话,你竖着读,就会得到a的非零元素的完整索引。
以下是一些例子:

一维数组情况:

>>> import numpy as np
>>> a = [0,2,3]
>>> b = np.nonzero(a)
>>> b
(array([1, 2], dtype=int64),)
>>> np.array(b).ndim
2
>>> 

二维数组情况:

>>> a = np.array([[0,0,3],[0,0,0],[0,0,9]])
>>> b = np.nonzero(a)
>>> b
(array([0, 2], dtype=int64), array([2, 2], dtype=int64))
>>> np.array(b).ndim
2
>>> np.transpose(np.nonzero(a))
array([[0, 2],
       [2, 2]], dtype=int64)
>>> 

机器学习实战代码片段:

# 二元切分
def binSplitDataSet(dataSet, feature, value): # 三个参数:数据集合,待切分的特征,和该特征的某个值
    mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:] # 数组过滤
    mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:]
    return mat0,mat1 # 返回两个子集
>>> testMat=mat(eye(4))
>>> testMat
matrix([[ 1.,  0.,  0.,  0.],
        [ 0.,  1.,  0.,  0.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  1.]])
>>> nonzero(testMat[:,1] > 0.5)
(array([1], dtype=int64), array([0], dtype=int64))
>>> nonzero(testMat[:,1] > 0.5)[0]
array([1], dtype=int64)
>>> testMat[nonzero(testMat[:,1] > 0.5)[0],:]
matrix([[ 0.,  1.,  0.,  0.]])
>>> testMat[nonzero(testMat[:,1] > 0.5)[0],:][0]
matrix([[ 0.,  1.,  0.,  0.]])
>>> testMat[nonzero(testMat[:,1] <= 0.5)[0],:] # 根据特征分得样本集
matrix([[ 1.,  0.,  0.,  0.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  1.]])
>>> testMat[nonzero(testMat[:,1] <= 0.5)[0],:][0] # 源代码有问题(最后的[0]应去掉)
matrix([[ 1.,  0.,  0.,  0.]])
>>> 
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值