概要
简单介绍几种用于判断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()