numpy核心库¶
1.3.0 新版功能.
从numpy 1.3.0开始,我们将致力于从依赖于Python的代码中分离纯C“计算”代码。目标有两个:使代码更干净,并允许numpy之外的其他扩展(scipy等)重用代码。
numpy核心数学库¶
numpy核心数学库(“npymath”)是朝这个方向迈出的第一步。这个库包含大多数与数学相关的C99功能,可以在不支持C99的平台上使用。核心数学函数与C99函数具有相同的API,除了npy前缀。
可用函数在<numpy/npy_math.h>中定义-如果有疑问,请参阅此标题。
浮点分类¶
-
NPY_NAN
¶ 此宏定义为NaN(不是数字),并保证未设置符号位(“正”NaN)。相应的单精度宏和扩展精度宏的后缀为F和L。
-
NPY_INFINITY
¶ 此宏被定义为正INF。相应的单精度宏和扩展精度宏的后缀为F和L。
-
NPY_PZERO
¶ 此宏被定义为正零。相应的单精度和扩展精度宏有后缀f和l。
-
NPY_NZERO
¶ 此宏被定义为负零(即符号位集)。相应的单精度宏和扩展精度宏的后缀为F和L。
-
int
npy_isnan
(x)¶ 这是一个宏,相当于c99 is nan:适用于单精度、双精度和扩展精度,返回的非0值是x是NaN。
-
int
npy_isfinite
(x)¶ 这是一个宏,相当于c99是有限的:适用于单精度、双精度和扩展精度,返回的非0值是x既不是NaN也不是无穷大。
-
int
npy_isinf
(x)¶ 这是一个宏,相当于c99 isif:适用于单精度、双精度和扩展精度,返回一个非0值x为无穷大(正和负)。
-
int
npy_signbit
(x)¶ 这是一个宏,相当于c99符号位:适用于单精度、双精度和扩展精度,返回的非0值是x有符号位集(即数字为负数)。
-
double
npy_copysign
(double x, double y)¶ 这是一个相当于c99 copysign:return x的函数,其符号与y相同。适用于任何值,包括inf和nan。单精度和扩展精度有后缀F和L。
1.4.0 新版功能.
有用的数学常数¶
以下数学常数可用于 npy_math.h
. 单精度和扩展精度也可通过添加 f
和 l
后缀。
-
NPY_E
¶ 自然对数底 (e )
-
NPY_LOG2E
¶ 以2为底的欧拉常数的对数 (\frac{{\ln(e)}}{{\ln(2)}} )
-
NPY_LOG10E
¶ 以10为底的欧拉常数的对数 (\frac{{\ln(e)}}{{\ln(10)}} )
-
NPY_LOGE2
¶ 2的自然对数 (\ln(2) )
-
NPY_LOGE10
¶ 自然对数10 (\ln(10) )
-
NPY_PI
¶ 圆周率 (\pi )
-
NPY_PI_2
¶ PI除以2 (\frac{{\pi}}{{2}} )
-
NPY_PI_4
¶ PI除以4 (\frac{{\pi}}{{4}} )
-
NPY_1_PI
¶ π的倒数 (\frac{{1}}{{\pi}} )
-
NPY_2_PI
¶ π倒数的两倍 (\frac{{2}}{{\pi}} )
-
NPY_EULER
¶ - 欧拉常数
- \lim_{n\rightarrow\infty}({\sum_{k=1}^n{\frac{1}{k}}-\ln n})
低级浮点操作¶
这些对于精确的浮点比较很有用。
-
double
npy_nextafter
(double x, double y)¶ 这是一个等价于c99 nextafter的函数:从x返回y方向上的下一个可表示的浮点值。单精度和扩展精度都有后缀f和l。
1.4.0 新版功能.
-
double
npy_spacing
(double x)¶ 这是一个等价于Fortran内部函数的函数。从x返回x和下一个可表示的浮点值之间的距离,例如间距(1)==eps。NAN和+/-INF返回NAN的间距。单精度和扩展精度有后缀F和L。
1.4.0 新版功能.
-
void
npy_set_floatstatus_divbyzero
()¶ 设置除以零浮点异常
1.6.0 新版功能.
-
void
npy_set_floatstatus_overflow
()¶ 设置溢出浮点异常
1.6.0 新版功能.
-
void
npy_set_floatstatus_underflow
()¶ 设置下溢浮点异常
1.6.0 新版功能.
-
void
npy_set_floatstatus_invalid
()¶ 设置无效的浮点异常
1.6.0 新版功能.
-
int
npy_get_floatstatus
()¶ 获取浮点状态。返回具有以下可能标志的位掩码:
- NPY_FPE_DIVIDEBYZERO
- NPY_FPE_OVERFLOW
- NPY_FPE_UNDERFLOW
- NPY_FPE_INVALID
注意
npy_get_floatstatus_barrier
更可取的是,它可以防止主动编译器优化相对于代码设置状态重新排序调用,这可能导致错误的结果。1.9.0 新版功能.
-
int
npy_get_floatstatus_barrier
(char*)¶ 获取浮点状态。传入一个指向局部变量的指针,以防止有攻击性的编译器优化相对于设置状态的代码重新进行此函数调用,这可能导致错误的结果。
返回具有以下可能标志的位掩码:
- NPY_FPE_DIVIDEBYZERO
- NPY_FPE_OVERFLOW
- NPY_FPE_UNDERFLOW
- NPY_FPE_INVALID
1.15.0 新版功能.
-
int
npy_clear_floatstatus
()¶ 清除浮点状态。返回上一个状态掩码。
注意
npy_clear_floatstatus_barrier
更可取的是,它可以防止主动编译器优化相对于代码设置状态重新排序调用,这可能导致错误的结果。1.9.0 新版功能.
-
int
npy_clear_floatstatus_barrier
(char*)¶ 清除浮点状态。传入了指向局部变量的指针,以防止有攻击性的编译器优化重新处理此函数调用。返回上一个状态掩码。
1.15.0 新版功能.
复杂函数¶
1.4.0 新版功能.
增加了类似C99的复杂函数。如果您希望实现可移植的C扩展,可以使用这些扩展。由于我们仍然支持没有c99复杂类型的平台,因此需要限制为c90兼容语法,例如:
/* a = 1 + 2i \*/
npy_complex a = npy_cpack(1, 2);
npy_complex b;
b = npy_log(a);
与扩展中的核心数学库链接¶
1.4.0 新版功能.
要在自己的扩展中使用核心数学库,需要在setup.py中将npymath编译和链接选项添加到扩展中:
>>> from numpy.distutils.misc_util import get_info
>>> info = get_info('npymath')
>>> config.add_extension('foo', sources=['foo.c'], extra_info=info)
换句话说,信息的用法与使用blas_info和co时完全相同。
半精度函数¶
2.0.0 新版功能.
头文件<numpy/halffloat.h>提供了使用IEEE754-2008 16位浮点值的函数。虽然这种格式通常不用于数值计算,但对于存储需要浮点但不需要太高精度的值很有用。它还可以作为一种教育工具来了解浮点舍入误差的性质。
与其他类型一样,numpy包含一个typedef npy_half,用于16位浮点。与大多数其他类型不同,在C中不能将其用作普通类型,因为它是npy uint16的typedef。例如,1.0看起来像0x3c00到c,如果在不同的有符号零之间进行相等比较,您将得到-0.0!= 0(0x8000!=0x0000),不正确。
出于这些原因,numpy提供了一个API,通过包含<numpy/halffloat.h>并链接到“npymath”来使用npy_half值。对于不直接提供的函数(如算术运算),首选方法是转换为float或double,然后再转换回来,如下例所示。
npy_half sum(int n, npy_half *array) {
float ret = 0;
while(n--) {
ret += npy_half_to_float(*array++);
}
return npy_float_to_half(ret);
}
外部链接:
- 754-2008 IEEE Standard for Floating-Point Arithmetic __
- Half-precision Float Wikipedia Article __.
- OpenGL Half Float Pixel Support __
- The OpenEXR image format __.
-
NPY_HALF_ZERO
¶ 此宏被定义为正零。
-
NPY_HALF_PZERO
¶ 此宏被定义为正零。
-
NPY_HALF_NZERO
¶ 此宏被定义为负零。
-
NPY_HALF_ONE
¶ 此宏定义为1.0。
-
NPY_HALF_NEGONE
¶ 此宏定义为-1.0。
-
NPY_HALF_PINF
¶ 此宏定义为+inf。
-
NPY_HALF_NINF
¶ 此宏定义为-inf。
-
NPY_HALF_NAN
¶ 该宏被定义为NaN值,保证其符号位未设置。
-
npy_half
npy_float_to_half
(float f)¶ 将单个精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。
-
npy_half
npy_double_to_half
(double d)¶ 将双精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。
-
npy_half
npy_half_nextafter
(npy_half x, npy_half y)¶ 半精度浮点与低级浮点部分中描述的npy-nextafter和npy-nextafterf相同。
-
npy_uint16
npy_floatbits_to_halfbits
(npy_uint32 f)¶ 将存储为uint32的32位单精度浮点转换为16位半精度浮点的低级函数。
-
npy_uint16
npy_doublebits_to_halfbits
(npy_uint64 d)¶ 将一个64位双精度浮点(存储为uint64)转换为16位半精度浮点的低级函数。
-
npy_uint32
npy_halfbits_to_floatbits
(npy_uint16 h)¶ 将16位半精度浮点转换为32位单精度浮点的低级函数,存储为uint32。
-
npy_uint64
npy_halfbits_to_doublebits
(npy_uint16 h)¶ 将16位半精度浮点转换为64位双精度浮点的低级函数,存储为uint64。