numpy中的nonzero()的用法

本文详细介绍了NumPy库中的nonzero()函数,该函数用于找出数组中非零元素的位置。通过多个实例展示了如何使用此函数处理一维及多维数组,并解释了其在布尔数组索引中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用布尔数组直接作为下标对象或者元组下标对象中有布尔数组时,都相当于用nonzero()将布尔数组转换成一组整数数组,然后使用整数数组进行下标运算。
###函数的作用
nonzero(a)返回数组a中值不为零的元素的下标,它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

class A:
  def __nonzero__(self):
    print 'A._nonzero__()'
    return True

print 'A is not zero' if A() else 'A is zero'
print bool(A())

**输入值:**数组或矩阵
返回输入值中非零元素的信息(以矩阵的形式)
这些信息中包括 两个矩阵, 包含了相应维度上非零元素所在的行标号,与列标标号。
例如:a=mat([ [1,0,0],[0,0,0],[0,0,0]])
则 nonzero(a)
返回值为两个矩阵:(matrix([[0]], dtype=int32), matrix([[0]], dtype=int32)) ,
表示输入矩阵a只有1个非零值, 第一个matrix([[0]], dtype=int32)表示非零元素在第0行, 第二个matrix([[0]], dtype=int32)表示在第0行的第0列。
###案例

####案例1

b1=np.array([True,False,True,False])
print(np.nonzero(b1))
(array([0, 2], dtype=int64),)

例如对于一维布尔数组b1,nonzero(b1)所得到的是一个长度为1的元组,因为矩阵有两个非0值。它表示b1[0]和b1[2]的值不为0(False)。
####案例2

b2=np.array([[True,False,True],[True,False,False]])
print(np.nonzero(b2))
(array([0, 0, 1], dtype=int64), array([0, 2, 0], dtype=int64))

对于二维数组b2,nonzero(b2)所得到的是一个长度为2的元组。因为矩阵b2只有3个非零值,它的第0个元素是数组a中值不为0的元素的第0轴的下标,第1个元素则是第1轴的下标,因此从下面的结果可知b2[0,0]、b[0,2]和b2[1,0]的值不为0:

####案例3
当布尔数组直接做为numpy数组下标时,相当于使用由nonzero()转换之后的元组作为下标对象:

a = np.arange(3*4*5).reshape(3,4,5)
print(a)
print(a[np.nonzero(b2)])

[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]

[[20 21 22 23 24]
[25 26 27 28 29]
[30 31 32 33 34]
[35 36 37 38 39]]

[[40 41 42 43 44]
[45 46 47 48 49]
[50 51 52 53 54]
[55 56 57 58 59]]]

[[ 0 1 2 3 4]
[10 11 12 13 14]
[20 21 22 23 24]]

####案例4
为了观察变化,下面有一个例子:

from numpy.ma import nonzero, array
dataSet=array(
    [[1,0,0,0],
    [0,1,0,0],
    [0,1,0,0],
    [0,0,0,1]])
a=dataSet[:,1]>0.5
print(a)
print('--------------')
print(nonzero(a))
print('--------------')
print(nonzero(a)[0])
print('--------------')
print(dataSet[nonzero(a)[0],:])

output:

[False  True  True False]
--------------
(array([1, 2], dtype=int64),)
--------------
[1 2]
--------------
[[0 1 0 0]
 [0 1 0 0]]

####案例五

推荐算法直通车

微信号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的小小小学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值