numpy中的nonzero()

article/2025/10/2 17:52:29

nonzero(a)
nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数。它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

(1)只有a中非零元素才会有索引值,那些零值元素没有索引值;

(2)返回的索引值数组是一个2维tuple数组,该tuple数组中包含一维的array数组。其中,一维array向量的个数与a的维数是一致的。

(3)索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果a是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值。

(4)transpose(np.nonzero(x))函数能够描述出每一个非零元素在不同维度的索引值。

(5)通过a[nonzero(a)]得到所有a中的非零值

矩阵图:

这里写图片描述

a是一维数组

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

说明:索引1和索引2的位置上元素的值非零

a是二维数组

>>> 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)
>>> 

说明:

(1)a中有2个非零元素,因此,索引值tuple中array的长度为2。因为,只有非零元素才有索引值。

(2)索引值数组是2 维的。实际上,无论a的维度是多少,索引值数组一定是2维的tuple,但是tuple中的一维array个数和a的维数一致。

(3)第1个array([0, 2])是从row值上对3和9进行的描述。第2个array([2, 2])是从col值上对3和9的描述。这样,从行和列上两个维度上各用一个数组来描述非零索引值。

(4)通过调用np.transpose()函数,得出3的索引值是[0 2],即第0行,第2列。

又一例子:

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

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

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

>>> a = np.arange(3*4*5).reshape(3,4,5)  
>>> a
array([[[ 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]]])
>>> a[b2]
array([[ 0,  1,  2,  3,  4],[10, 11, 12, 13, 14],[20, 21, 22, 23, 24]])
>>> a[np.nonzero(b2)]
array([[ 0,  1,  2,  3,  4],[10, 11, 12, 13, 14],[20, 21, 22, 23, 24]])
>>> 

a是三维数组

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

说明:由于a是3维数组,因此,索引值数组有3个一维数组。

机器学习实战代码片段:

注意下面的代码是修改的代码:

# 二元切分
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.]])
>>> 

一个验证例子:

>>> testMat=mat(eye(4)) # 定义一个单位阵
>>> testMat
matrix([[ 1.,  0.,  0.,  0.],[ 0.,  1.,  0.,  0.],[ 0.,  0.,  1.,  0.],[ 0.,  0.,  0.,  1.]])
>>> nonzero(testMat >0.5) # 大于0.5的元素所在横纵轴的描述
(array([0, 1, 2, 3], dtype=int64), array([0, 1, 2, 3], dtype=int64))
>>> transpose(nonzero(testMat >0.5)) # 元素坐标
array([[0, 0],[1, 1],[2, 2],[3, 3]], dtype=int64)
>>> testMat[:,1] # 第一列
matrix([[ 0.],[ 1.],[ 0.],[ 0.]])>>> a=transpose(nonzero(testMat[:,1] >0.5))# 第一列也就是上述列向量中大于0.5的坐标[1,0]
>>> a
array([[1, 0]], dtype=int64)
>>> a[0] # 由于a是[[1, 0]],所以a[0]是[1,0]
array([1, 0], dtype=int64)
>>> testMat[a[0],:] # 得到了testMat的第2行和第1行
matrix([[ 0.,  1.,  0.,  0.],[ 1.,  0.,  0.,  0.]])
>>> testMat[a[0],:][0] # 得到了针对testMat第1列元素中大于0.5的元素所在整行
matrix([[ 0.,  1.,  0.,  0.]])
>>> 

http://chatgpt.dhexx.cn/article/uD6lMnTD.shtml

相关文章

Python中nonzero()函数的用法

Python中nonzero()函数可以提取出矩阵中非零元素的行列。用法如下&#xff1a; import numpy as npdata np.array([[1, 0, 2], [0, 3, 0], [0, 0, 0]]) print(data) print(data.nonzero())运行结果如下&#xff1a; 可以看到&#xff0c;非零元素被分成行和列。 当然对于稀…

Vue之绑定class/style样式与条件渲染

1.绑定class样式: <div id"root"> <!-- 绑定class样式--字符串写法&#xff0c;适用于&#xff1a;样式的类名不确定&#xff0c;要动态确定--><div class"basic" :class"mood" click"change()">{{name}}</d…

vue3 样式绑定class绑定

class绑定1:classsty为一个变量&#xff0c;当用引起来时为一个字符串&#xff0c;sty其值为vm中data的box1取box1样式,触发点击事件后sty取值为sty2,取的sty2的样式。 class2样式绑定二 class 类名为多类名&#xff0c;类名为对象中的属性&#xff0c;属性名作为类名&#xf…

Vue.js绑定class属性

绑定class属性的格式是 v-bind:class "语句", 可以缩写为 :class "语句" 。class属性是可以有多个的&#xff0c;在" "内可以有多种不同的情况。下面介绍在" "写入的不同情况。 目录 一、" "内是vue对象内存在的对…

vue动态绑定class的几种方式

参考链接&#xff1a;vue动态绑定class的几种方式 - 走看看 vue动态绑定class的几种方式&#xff1a; 方式①&#xff1a;直接三元表达式判断&#xff0c;动态绑定类名 :class"isUsed ? ruleUsedLabel : ruleUnusedLabel" 方式②&#xff1a;绑定对象 &#xf…

初学必懂—vue绑定class的几种方式+绑定内联样式总结

文章目录 本篇博客主要学习内容&#x1f33c;对象语法&#x1f33a;数组语法&#x1f34d;绑定内联样式&#x1f349; 本篇博客主要学习内容&#x1f33c; 先来看看以下这些语句都熟不熟悉吧&#xff01;这些节选于后续的博客内容&#x1f33b;&#x1f33b;&#x1f33b; &l…

22.Vue绑定class样式

目录 1.绑定class样式-字符串写法&#xff08;适用于样式的类名不确定&#xff0c;需要动态指定&#xff09; 2.绑定class样式-数组写法&#xff08;适用于样式的个数不确定&#xff0c;名字也不确定&#xff09; 3.绑定class样式-对象写法&#xff08;适用于样式的个数确定…

Vue基础知识总结 2:vue 动态绑定

&#x1f3c6;作者简介&#xff1a;哪吒&#xff0c;CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家&#x1f4aa;&#xff0c;专注Java硬核干货分享&#xff0c;立志做到Java赛道全网Top N。 &#x1f3c6;本文收录于&#xff0c;Java基础教程系列…

SQL语句:将查询结果合并一起,语句优化

需求驱动 为了使得表格更好看些&#xff0c;我需要把查询结果合在一起&#xff0c;这样看起来就是一体的了。主要是性能测试有需求&#xff1a; 1、查询当前库设备 2、查询新增设备 3、计算每秒鉴权数 这个对我来说比较简单&#xff0c;分开查询就可以了。但我对自己不能要求这…

sql查询将多个结果合并成一个字符串(GROUP_CONCAT和CONCAT)

完整语法如下 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator 分隔符]) SELECT * FROM testgroup 表结构与数据如上 现在的需求就是每个id为一行 在前台每行显示该id所有分数 group_concat 上场&#xff01;&#xff01;&#xff01; SELECT…

Mysql合并两个sql结果

第一条sql及结果 SELECT value4 AS ‘压缩机功率’, create_date AS ‘时间’ FROM gree_data WHERE data_belong ‘External_05’ AND create_date > ‘2019-10-23 17:03:59’ ORDER BY create_date 结果展示&#xff1a; 第二条sql及结果 SELECT value2 AS ‘工作模…

sql——合并两个sql的结果

表结构 iot_street_road表&#xff1a; iot_street_staff_road表&#xff1a; iot_street_tree表: 想得到结果&#xff1a; road_namestaff_counttree_count街道名工人数量苗木数量 实现方法&#xff1a; 把表一和表二、表一和表三分别按road_id聚合&#xff0c;得到的结果合…

SQL查询结果拼接

Sql查询结果进行拼接 对查询结果进行拼接&#xff0c;可使用group_concat()&#xff0c;concat()&#xff0c;concat_ws()函数。简单介绍下如何应用。 Mysql中的group_concat() 功能&#xff1a;可以group by产生的同一分组的值连接起来,返回一个字符串。 参数格式&#xff…

sql查询结果合并

使用group_concat合并多行查询结果为一行select gs.id id,gs.gs_no gs_no,gs.apply_date apply_date,gs.create_by create_by,group_concat(gd.name) name,gs.apply_description apply_description,gd.unit_name unit_name,gs.apply_status apply_status,gs.apply_by apply_by …

oracle 将多个查询结果合并

首先要区分一个概况&#xff0c;多个查询结果分两种&#xff0c;一种是一条sql查询多个结果&#xff0c;还有一种是多条sql语句查询出多个结果。 先看第一个&#xff0c;一条语句查询出多个结果&#xff0c;将多个结果合并成一条记录&#xff1a; 在oracle中有一个wm_concat()函…

mysql 合并两个查询结果

合并两个查询结果 查询结果1&#xff1a; select date(complete_time) as time,sum(amt) as amount_out from withdraw where state3 group by date(complete_time) 查询结果2 select date(update_time) as time,sum(transfer_amount) as amount_in from user_charge where st…

SQL合并查询数据,以逗号分隔

功能描述&#xff1a; 将查询到的数据合并为一条数据&#xff0c;以逗号分隔 案例&#xff1a; 功能描述&#xff1a; 现有三张表&#xff1a; Student&#xff08;学生表&#xff09; Course&#xff08;课程表&#xff09; Student-Course&#xff08;学生课程关联表&am…

MySQL合并查询结果

利用 UNION 关键字&#xff0c;可以给出多条 SELECT 语句&#xff0c;并将它们的结果组合成单个结果集。合并 时&#xff0c;两个表对应的列数和数据类型必须相同。各个 SELECT 语句之间使用 UNION 或 UNION ALL 关键字分隔。UNION 不使用关键字 ALL&#xff0c;执行的时候删除…

SQL如何使两个select语句查询结果合并一个

SQL如何使两个select语句查询结果合并一个&#xff1f; ——在网上看到别人遇到的情况&#xff0c;觉得有点意思&#xff0c;先收集下来~ 解决办法&#xff1a; select isnull(a.unit,b.fine_units) unit,isnull(a.number,0) number,isnull(b.fine_number,0) fine_numberfrom…

sqlsever2019:union合并多个查询结果

文章目录 一、前言二、区别union和连接三、union实例四、union all合并表五、union中的oder by子句六、union自动数据类型转换七、使用union合并不同类型的数据八、union合并不同列数的两个表九、union多表合并 一、前言 表的合并操作将两个表的行合并到一个表中&#xff0c;不…