Numpy tips: 如何检查一个numpy数组是否全0?_numpy 判断数组元素-程序员宅基地

技术标签: python  Python学习点滴  numpy  

目录

0 概要

1 numpy.any()

2 numpy.count_nonzero()

3 numpy.all()  

4. 多维数组可以分axis进行判断


0 概要

        简单介绍几种用于判断numpy数组是否全零的测试方法。

1 numpy.any()

        numpy.any()函数用于检查一个numpy数字是否存在任何一个非0元素,因此将numpy.any()的结果取反即得“numpy数组是否全0”的结果。例如:      

import numpy as np

print('Using numpy.any()...')
a_1D = np.zeros(5)
print('Is a_1D all zeros?: ', not(np.any(a_1D)))
print('Is a_1D all zeros?: ', ~(np.any(a_1D)))
a_1D[2] = -1
print('Is a_1D all zeros?: ', not(np.any(a_1D)))

a_2D = np.zeros((2,3))
print(a_2D)
print('Is a_2D all zeros?: ', not(np.any(a_2D)))
a_2D[1,2] = 0.1
print('Is a_2D all zeros?: ', not(np.any(a_2D)))

输出结果:

        Using numpy.any()...
        Is a_1D all zeros?:  True
        Is a_1D all zeros?:  True
        Is a_1D all zeros?:  False
        [[0. 0. 0.]
         [0. 0. 0.]]
        Is a_2D all zeros?:  True
        Is a_2D all zeros?:  False

        注意,python中逻辑取反可以用"~"也可以用"not",但是不能用“!”(“!=”是比较运算符--comparison operator, 只能用于比如说"b!=c"这样)。另外,"~"和"not"也是有区别的,参见以下第4节。

2 numpy.count_nonzero()

      numpy.count_nonzero()用于对数组的0元素个数进行计数,因此也可以用来执行是否全0的判断。用法如下:

print('Using numpy.nonzero()...')
a = np.array([1,2,3,0,0,1])
print('Number of zeros in a = ',np.count_nonzero(a))
print('Is a all zeros?: ', np.count_nonzero(a)==0)
a[:] = 0 # Force a to all-zeros array
print('Is a all zeros?: ', np.count_nonzero(a)==0)
print('Is a all zeros?: ', not np.count_nonzero(a))

        Using numpy.nonzero()...
        Number of zeros in a =  4
        Is a all zeros?:  False
        Is a all zeros?:  True
        Is a all zeros?:  True 

3 numpy.all()  

        用numpy.all()也可以实现这一功能。以下例子利用了python内部会自动进行0--False, 1--True的转换。

print('')
print('Using numpy.all()...')
a = np.zeros(10)
print('Is a all zeros?: ', np.all(a==0))

        Using numpy.all()...
        Is a all zeros?:  True 

4. 多维数组可以分axis进行判断

        对于多维数组(这正是numpy正真发挥强悍实力的地方)以上函数在缺省情况下是对整个数组进行统一判断,但是也可以通过axis参数指定沿指定轴分别处理。如下例所示:

print('')
print('Judge according to the specified axis')
a_2D = np.zeros((2,3))
a_2D[1,2] = 0.1
print(a_2D)
print('Is each col of a_2D all zeros?: ', ~(np.any(a_2D, axis=0)))
print('Is each row of a_2D all zeros?: ', ~(np.any(a_2D, axis=1)))

Judge according to the specified axis
[[0.  0.  0. ]
 [0.  0.  0.1]]
Is each col of a_2D all zeros?:  [ True  True False]
Is each row of a_2D all zeros?:  [ True False]

        当指定axis=0时相当于对2维数组按列判断是否全0,指定axis=1时相当于对2维数组按行判断是否全0。当然,这里所说的行和列的概念是从传统的2维数组或者矩阵里继承而来的概念,当考虑更高维数组的时候,行和列这个概念就不再适用了。关于高维数组(也称:Tensor,张量)的axis将另文介绍。

        另外,前面提到表示逻辑取反的“~”和“not”是有所不同的。具体来说就是,not只接受一个操作数,因此以上这个例子如果将"~"改为not的话会报错,如下所示:

print('Is each col of a_2D all zeros?: ', not(np.any(a_2D, axis=0)))
print('Is each row of a_2D all zeros?: ', not(np.any(a_2D, axis=1)))

        报错如下: 

        而“~”是所谓的Bitwise NOT operator.

        如果"~"的输入是一个整数的的话,它会将输入数的所有比特都取反。如果是一个numpy 数组的话,则会对其中每一个数执行按位逻辑取反操作。如果是一个numpy布尔类型(True, False)数组的话,则会对其中每一个布尔数执行逻辑取反操作--以上例子中正是这种用法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenxy_bwave/article/details/120798048

智能推荐

【HarmonyOS HiSpark IPC DIY Camera试用连载4 】 鸿蒙OS内核liteos-a如何启动第一个用户进程init_lite_lite_user_sec_entry原理-程序员宅基地

文章浏览阅读2.6k次。【HarmonyOS HiSpark IPC DIY Camera试用连载4 】 鸿蒙OS内核如何启动第一个用户进程init_lite1. 鸿蒙OS编译知识2. 从编译过程看鸿蒙OS代码结构3. 第一个用户态进程init_lite4. Init_lite是如何被kernel调用的?1. 鸿蒙OS编译知识(原理引自中科创达OpenHarmony研究组 鸿蒙OS开源代码精要解读之——init)OpenHarmony源码编译系统使用了google开发的gn工具以及ninjia。这二者结合起来比传统的make_lite_user_sec_entry原理

TheiSfM - Win7/VS2015/CMake_theia-sfm-程序员宅基地

文章浏览阅读1k次。Instruction for building TheiaSfM._theia-sfm

linux下安装mysql-5.7.25详细步骤_mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz下载-程序员宅基地

文章浏览阅读458次。第一步:下载进入到mysql官网下载自己对应版本的mysql,下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads我这里下载mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz版本也可以进入linux后用命令下载wget https://cdn.mysql.com//Downloads..._mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz下载

HDU 4348 SPOJ TTM To the moon(操作建树)_to the moon操作-程序员宅基地

文章浏览阅读388次。题意:给出一个序列,四种操作C l r d: Adding a constant d for every {Ai | l <= i <= r}, and increase the timestamp by 1, this is the only operation that will cause the timestamp increase. Q l r: Querying the current_to the moon操作

基于docker-compose做版本升级_升级 docker-compose-程序员宅基地

文章浏览阅读283次。将mysql的镜像导出成tar文件到当前文件夹。docker-compose.yml文件。#离线做mysql升级。_升级 docker-compose

出现java.lang.NumberFormatException: null的错我如何解决_numberformatexception null-程序员宅基地

文章浏览阅读469次。首先这是show.jsp pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><% request.setCharacterEncoding("utf-8"); String name = r_numberformatexception null

随便推点

引用形参和指针形参的比较_函数用形参 指针哪个效率高-程序员宅基地

文章浏览阅读1k次。指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针_函数用形参 指针哪个效率高

0012-用OpenCV批量读取图片的三种方法-程序员宅基地

文章浏览阅读3.3k次。有时我们需要批量读取图片,所以我们有必要知道怎么在OpenCV开源环境下批量读取图片!批量读取图片的关键是如何让程序知道文件夹下图片的名字!第一种方法:这种方法只针对图片名字有规律的情况,比如:***(0).jpg***(1).jpg***(2).jpg***(3).jpg..................源代码如下:代码中用到的图片下载链接为:http://pan.b..._opencv批量读取图片

.bat脚本基本命令语法_bat脚本串口发送-程序员宅基地

文章浏览阅读1.1k次。目录批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ft..._bat脚本串口发送

自己实现一个队列(Java)_java实现一个队列 匀速处理-程序员宅基地

文章浏览阅读1.5k次。思路:1、链表实现,不用考虑扩容问题2、节点维护next指针,每次删除元素,删除头结点,插入元素队尾插入代码:package com.datastructure.stackqueue;/** * 实现一个栈,自定义栈,用链表实现,方便扩容 */public class DefineQueue<T> { private Node<T> ..._java实现一个队列 匀速处理

QA面试题-程序员宅基地

文章浏览阅读880次,点赞19次,收藏17次。猴子测试是一种用于测试应用程序的黑盒测试,通过提供随机输入来检查系统行为,例如检查系统是否崩溃。测试主管通常会准备它,或者测试经理,文档的重点是描述要测试什么,如何测试什么时候测试,谁来做什么测试。我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。猴子测试和即席测试都遵循非正式的方法,但是在猴子测试中,我们不需要对软件有深入的了解。它是最终测试,同时执行功能性和非功能性测试。

UniCode转UTF8-程序员宅基地

文章浏览阅读79次。char *UniCodeToUTF8(CString strUniCode){ LPWSTR pWstr = new wchar_t[strUniCode.GetLength() + 1]; wcscpy(pWstr, T2W((LPTSTR)strUniCode.GetString())); //获取转完后的长度 int nLen = WideCh..._utf8_ai