下面这张表列出了Numpy中几乎所有常用的逻辑函数和位处理函数,这些函数都有着明确的数学概念,其主要的输入输出均符合来自数学公式的直觉,大部分数组操作则支持通过axis来调整作用的坐标轴,所以这些函数并不需要分条解析,甚至从我的角度来说,过于琐碎的文字堆积,将这上百个函数写他个几页甚至十几页,反而会影响阅读。
真值测试 | all数组全为True;any数组中有True |
内容测试 | isfinite, isinf, isneginf, isposinf, isnan, isnat |
类型测试 | iscomplex, iscomplexobj, isreal, isrealobj, |
isfortran, isscalar | |
逻辑计算 | logical_and, logical_or, logical_not, logical_xor |
比较 | array_equal, array_equiv, equal, not_equal |
greater, greater_equal, less, less_equal | |
signbit小于0时为True | |
位运算 | bitwise_and, bitwise_or, bitwise_xor, bitwise_not(invert), left_shift, right_shift |
临近判断 | allclose, isclose, spacing |
其中有关数组类型的测试函数有必要说明一下
iscomplex(x)
判断是否为复数iscomplexobj(x)
判断是否为复数据类型isfortran(a)
检查数组是否按照Fortran的形式存储。isreal(x)
判断是否为实数isrealobj(x)
判断是否为实数对象isscalar(num)
如果num为标量类型,则返回True。令人困惑的是Fortran-order 和C-order的区别,这里主要涉及到数据在内存中的组织方式,可以在创建数组时通过order='c'
或者order=FORTRAN
来规定。
现有两个等长数组a
和b
,如果想判断二者之差是否在允许的范围之内,则可通过allclose
。
>>> import numpy as np
>>> x = np.arange(10)
>>> y = x + np.random.rand(10)
>>> np.allclose(x,y,1)
True
>>> np.allclose(x,y,0.2)
False
>>> np.isclose(x,y,0.2)
array([False, False, True, True, True, True, True, True, True, True])
通过frexp
可以将数值分解为二进制指数和尾数,相当于把值分解为
a
×
2
b
a\times2^b
a×2b中的
a
a
a和
b
b
b。ldexp
则为其反运算。
>>> np.frexp(float(16))
(0.5, 5)
>>> np.ldexp(0.5,5)
16.0
spacing可以获取数值在编程语言中的固有误差,
>>> np.spacing(1)
2.220446049250313e-16
这个很容易理解,在编程语言中,所有数值都是通过二进制表示的,所以这个1
也不列外,但二进制表示的浮点数,并不能精确地描述每个数值,所以,与自然数1最接近的二进制浮点数,彼此相差大约2e-16
。
nextafter可以得到距离某个值最近的下一个二进制浮点数
>>> np.nextafter(2,1)
1.9999999999999998
>>> np.nextafter(2,2)
2.0
>>> np.nextafter(2,3)
2.0000000000000004
其第二个参数表示所谓下一个指代的方向。