Python的nonzero函数

最近在看SVM程序时遇到了nonzero()函数,对其的返回值开始有误解,因此记录下来.np.nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数.


np.nonzero()

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中的非零值
从代码来看:

import numpy as np
a=[1,0,2]
b=np.nonzero(a)
print(b)
则输出如下:
array([0,2]),即a[0],a[2]是非零

一维数组很好理解,那么二维呢

import numpy as np
a=[[0],[1],[2]]
b=np.nonzero(a)
print(b)
输出如下:
(array([1, 2]), array([0, 0]))
这里我们可以看出,实际上逻辑上理解的应该是([1,0],[2,0]),也就是第一个array存储的是行号,第二个存储的是列号

这种方式在SVM对应的代码是:

vaildEcacheList = nonzero(oS.eCache[:,0].A)[0]

得到我想要的非零的向量的行号
,三维数组也是一样:

a = np.array([[[0,1],[1,0]],[[0,1],[1,0]],[[0,0],[1,0]]])
b = np.nonzero(a)
print(np.array(b).ndim)
print(b)
结果:
2
(array([0, 0, 1, 1, 2], dtype=int64), array([0, 1, 0, 1, 1], dtype=int64), array([1, 0, 1, 0, 0], dtype=int64))
说明:由于a是3维数组,因此,索引值数组有3个一维数组。
print(a)
[[[0 1]
  [1 0]]

 [[0 1]
  [1 0]]

 [[0 0]
  [1 0]]]
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小方爱自律

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

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

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

打赏作者

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

抵扣说明:

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

余额充值