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中的非零值

特别地,归于最后生成元组里数据的长度,有多少的非零元素,就有多长! 

nonzeros(a)返回数组a中值不为零的元素的下标,它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

b0 =np.array([1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1])
# 可以看出是第0,13,17的位置上元素非0,也就是说 nunzero函数是找出矩阵中非零元素的位置
print(np.nonzero(b0)) # (array([ 0, 13, 17], dtype=int64),)
# 这样一般使用
value_pos = np.nonzero(b0)[0]
print(value_pos) # [ 0 13 17]

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


b1 = np.array([True, False, True, False])
# 计算的是:值不为零(False)的元素的下标,这里index=0和index=2是不为0的
print(np.nonzero(b1))  # (array([0, 2], dtype=int64),)

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

b2 = np.array([[True, False, True], [True, False, False]])
# nonzero(b2)所得到的是一个长度为2的元组
print(np.nonzero(b2))
# (array([0, 0, 1], dtype=int64), array([0, 2, 0], dtype=int64))

解释如下,它是每一维,每一维单独统计(可能描述不太准确)。

如下图,矩阵中不为0(FALSE)的位置是篮圈,统计每个篮圈的数据。

首先是黄色的点,第一个T的黄点是0,第二个T的黄点是0,第三个T的黄点是1,所以元祖的第一个数据是(0,0,1);

其次是绿色的点,第一个T的绿点是0,第二个T的绿点是2,第三个T的绿点是0,所以元祖的第二个数据是(0,2,0)。

不是布尔类型时,直接看例子。核心思想还是找到非0元素的位置

b3 = np.arange(3*4*5).reshape(3,4,5)
print(b3)
"""
[[[ 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]]]
"""
print(np.nonzero(b3))
"""
(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int64),
array([0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0,0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64),
array([1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2,3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4,0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
"""

另外,当我想统计形状的时候:

    print(np.nonzero(b3).shape)
AttributeError: 'tuple' object has no attribute 'shape'

这东西是个元祖,

bb = np.nonzero(b3)
print(len(bb))# 3
print(len(bb[0])) # 59
print(len(bb[1])) # 59
print(len(bb[2])) # 59
print(bb[0][1]) # 0# print(len(bb[3])) # 59
# IndexError: tuple index out of range

注意,在结果里去每个array对应的位置就是非0值的位置啦~ 001,002,003都是非0的。

测试一下是否真的掌握了~

#a是1维数组
a = [0,2,3]
b = np.nonzero(a)
print(np.array(b).ndim)
print(b)结果:
2
(array([1, 2], dtype=int64),)
说明:索引1和索引2的位置上元素的值非零。#a是2维数组
a = np.array([[0,0,3],[0,0,0],[0,0,9]])
b = np.nonzero(a)
print(np.array(b).ndim)
print(b)
print(np.transpose(np.nonzero(a)))
结果:
2
(array([0, 2], dtype=int64), array([2, 2], dtype=int64))
[[0 2][2 2]]
说明:
(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列。#a是3维数组
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]]]a的数组结构如上所示,请将a想像为数量为3的一组小图片,每张图片的大小为2*2,下文中以num * row * col来分别表示其维度。b包含3个长度为5的array,这意味着a有3维,且a共有5个非0值。先说b中的第1个向量是[0, 0, 1, 1, 2],这实际是a在num维度上描述的非零值。第0张图上有2个非零值,第1张图上有2个非零值,第2张图上有1个非零值。因此在num维度上的非零值数组为[0, 0, 1, 1, 2]。b中的第2个向量是[0, 1, 0, 1, 1],这实际是a在row维度上描述的非零值。由于row上的值只有0和1(只2行),所以只由0和1组成。b中的第3个向量,聪明的读者可能已经明白,不再赘述。

原博下看到有人问三维矩阵,分析如下,注意绿色箭头所指的收集顺序

转载请注明出处!

参考:

python numpy中nonzero()的用法

一文详解numpy中np.nonzero()函数

【numpy】numpy中np.nonzero()的用法相关推荐

  1. python中mean的用法_python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)[source] Compute the arithm ...

  2. python 的numpy库中的mean()函数用法介绍

    这篇文章主要介绍了python 的numpy库中的mean()函数用法介绍,具有很好对参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 mean() 函数定义: 2 mean()函数功能: 求取均 ...

  3. python average函数怎么用_python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)[source] Compute the arithm ...

  4. Numpy中np.indices函数用法详解

    np.indices官方文档定义如下: def indices(dimensions, dtype=int, sparse=False):"""Return an arr ...

  5. python numpy库中省略号...的一些用法

    在学习<Designing Machine Learning Systems with Python>(<机器学习系统设计Python语言实现>)一书的第五章梯度下降一节代码中 ...

  6. python中np.clip()的用法

    主要参考python中numpy模块下的np.clip()的用法,稍有改动 Numpy 中clip函数的使用 numpy.clip(a, a_min, a_max, out=None) Clip (l ...

  7. np.transpose np.nonzero的用法

    np.transpose 改变维度索引值 比如下面这个例子,n是一个三维数组,第0维度与第1维度互换了 np.nonzero nonzero函数是numpy中用于得到数组array中非零元素的位置(数 ...

  8. [转载] numpy.dot numpy.linalg.eig numpy.linalg.svd np.linalg.inv 用法 + 例子

    参考链接: Python中的numpy.dot numpy.dot() x是mn 矩阵 ,y是nm矩阵 则x.dot(y) 得到m*m矩阵 >>> np.dot(3, 4) 12 & ...

  9. python 的numpy库中的mean()函数用法

    1. mean() 函数定义: numpy. mean ( a,  axis=None,  dtype=None,  out=None,  keepdims=<class numpy._glob ...

最新文章

  1. IoU、GIoU、DIoU、CIoU损失函数
  2. 你曾经是那手握烙铁的少年
  3. 常考数据结构与算法:设计getMin功能的栈
  4. C++ Primer plus 第12章类和动态内存分配复习题参考答案
  5. 另我模糊的URL 重写
  6. Android中Chronometer计时器的简单使用
  7. Java NIO vs IO
  8. wordpress漏洞_WordPress XSS漏洞可能导致远程执行代码(RCE)
  9. constraintlayout布局新特性_AMD发布Ryzen PRO 4000系列移动处理器:多了超线程和商用安全特性...
  10. python给动态变量赋值_python 动态的定义变量名,并给其赋值
  11. python dataframe排序_python – Pandas DataFrame排序忽略了这种情况
  12. 分享一个棋力很强的象棋应用和一个强大的开局库
  13. Python爬虫【一】爬取移动版“微博辟谣”账号内容(API接口)
  14. 夏普SHARP AR-2818 一体机驱动
  15. 干货|手把手教你写一个串口调试助手
  16. 人工智能数学基础-线性代数1:向量及向量加减法与数乘
  17. matlab默认英文字体是什么?我使用console之后出现了乱码
  18. 宏病毒组(五)|病毒基因组系统发育树
  19. 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
  20. 海尔集团张瑞敏经典语录

热门文章

  1. deepin Linux降低CPU电压
  2. android中的ping命令使用
  3. c++遍历文件夹下所有图片
  4. test block.html文件不存在,我的世界testforblocks原版命令方块指令解读
  5. 【传智播客郑州校区分享】数据库MYSQL笔记详解
  6. PhotoShop - 选区跨图像移动
  7. 使用Netty实现客户端和服务端之间的双向通信
  8. ipad分屏功能怎么开启_率土之滨叫阵功能怎么出现的 开启叫阵方法一览
  9. 功能强大的房产系统开源可定制!
  10. 苹果充电显示不支持此配件_为什么苹果手机数据线会经常出现“可能不支持此配件”...