诚之和:Numpy怎么检查数组全为零的几种方法

Python012

诚之和:Numpy怎么检查数组全为零的几种方法,第1张

Numpy怎么检查数组全为零的几种方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面我将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

概要

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

1 numpy.any()

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

importnumpyasnp 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] =-1print('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.1print('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 arrayprint('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.1print(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)数组的话,则会对其中每一个布尔数执行逻辑取反操作。

可以使用 Python Image Library 做,load() 函数会返回一个对象,这个对象我们可以把它当作一个二维数组对待,而数组中存放的就是点的 RGB 值,可以很容易地访问到任何像素点的 RGB 值:

from PIL import Image

# 可以支持很多种图片格式.

im = Image.open("your_picture.jpg")

pix = im.load()

# 获得图片的尺度,可以用于迭代

print im.size

# 获得某个像素点的 RGB 值,像素点坐标由 [x, y] 指定

print pix[x,y]

# 设置 [x, y] 点的 RGB 的值为 value

pix[x,y] = value

# Python3.6

# 导入random模块

import random

# 定义一个人椅的类

class ManAndBench:

    def __init__(self, n_bench):

        self.bench_num = n_bench

        # 依次已经被占用的座位号

        self.break_point = []

    def print_bench(self):

        # 定义全0数组作为长椅

        pt_str = [0 for _ in range(self.bench_num)]

        # 按照占用的作为号,重写长椅数字

        for i, item in enumerate(self.break_point):

            # 长椅的第[作为号]赋值为第i+1个人

            pt_str[item] = i+1

        brk_num = len(self.break_point)

        if brk_num == 0:

            print("长椅为空:", pt_str)

        else:

            print("{:2d}号男人: {}".format(brk_num, pt_str))

    def next_man(self):

        # 如果是第一个人,使用随机占座

        if len(self.break_point) == 0:

            fst = random.randint(0, self.bench_num - 1)

            self.break_point.append(fst)

        else:

            brk_num = len(self.break_point)

            # 产生已经被占座的个数+1的全零数组,用于空的位置长度计数

            block_size = [0 for _ in range(brk_num + 1)]

            # 统计每个空位置的长度

            tmp = 0

            for i in range(self.bench_num):

                # 如果第i个作为没有被占用,则第tmp个数组加1

                if i not in self.break_point:

                    block_size[tmp] += 1

                # 否则,tmp加1,统计下一个间隔段的长度

                else:

                    tmp += 1

            # 找出最大长度,计算最大长度块的序号

            max_block = max(block_size)

            max_index = block_size.index(max_block)

            # 计算最大长度块在整个长椅中的分割点

            start = 0

            for i in range(max_index):

                start += block_size[i]+1

            self.break_point.append(start + max_block // 2)

 

            

c = int(input("请输入椅子的数量:"))

while True:

    m = int(input("请输入人的数量:"))

    if m <= c:

        break

    else:

        print("人数量大于椅子数量,请重新输入!")

# 引用定义的类

mab = ManAndBench(c)

# 打印长椅

mab.print_bench()

# 每次坐一个人,打印一次

for _ in range(m):

    mab.next_man()

    mab.print_bench()