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。

npy_isnan(x)

这是一个宏,相当于c99 is nan:适用于单精度、双精度和扩展精度,返回的非0值是x是NaN。

npy_isfinite(x)

这是一个宏,相当于c99是有限的:适用于单精度、双精度和扩展精度,返回的非0值是x既不是NaN也不是无穷大。

npy_isinf(x)

这是一个宏,相当于c99 isif:适用于单精度、双精度和扩展精度,返回一个非0值x为无穷大(正和负)。

npy_signbit(x)

这是一个宏,相当于c99符号位:适用于单精度、双精度和扩展精度,返回的非0值是x有符号位集(即数字为负数)。

npy_copysign(x, y)

这是一个相当于c99 copysign:return x的函数,其符号与y相同。适用于任何值,包括inf和nan。单精度和扩展精度有后缀F和L。

1.4.0 新版功能.

有用的数学常数

以下数学常数可用于 npy_math.h . 单精度和扩展精度也可通过添加 fl 后缀。

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时完全相同。

半精度函数

1.6.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值,保证其符号位未设置。

float npy_half_to_float(npy_half h)

将半精度浮点转换为单精度浮点。

double npy_half_to_double(npy_half h)

将半精度浮点转换为双精度浮点。

npy_half npy_float_to_half(float f)

将单个精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。

npy_half npy_double_to_half(double d)

将双精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。

int npy_half_eq(npy_half h1, npy_half h2)

比较两个半精度浮点(h1==h2)。

int npy_half_ne(npy_half h1, npy_half h2)

比较两个半精度浮点(h1!= H2)。

int npy_half_le(npy_half h1, npy_half h2)

比较两个半精度浮点(h1<=h2)。

int npy_half_lt(npy_half h1, npy_half h2)

比较两个半精度浮点(h1<h2)。

int npy_half_ge(npy_half h1, npy_half h2)

比较两个半精度浮点(h1>=h2)。

int npy_half_gt(npy_half h1, npy_half h2)

比较两个半精度浮点(h1>h2)。

int npy_half_eq_nonan(npy_half h1, npy_half h2)

比较已知不是NaN(h1==h2)的两个半精度浮点。如果值为NaN,则结果未定义。

int npy_half_lt_nonan(npy_half h1, npy_half h2)

比较两个已知不是NaN(h1<h2)的半精度浮点。如果值为NaN,则结果未定义。

int npy_half_le_nonan(npy_half h1, npy_half h2)

比较已知不是NaN(h1<=h2)的两个半精度浮点。如果值为NaN,则结果未定义。

int npy_half_iszero(npy_half h)

测试半精度浮点值是否等于零。这可能比调用npy_half_eq(h,npy_zero)稍快。

int npy_half_isnan(npy_half h)

测试半精度浮点是否为NaN。

int npy_half_isinf(npy_half h)

测试半精度浮点是正负inf。

int npy_half_isfinite(npy_half h)

测试半精度浮点是否有限(非NaN或Inf)。

int npy_half_signbit(npy_half h)

返回1表示h为负,否则返回0。

npy_half npy_half_copysign(npy_half x, npy_half y)

返回x的值,符号位从y复制。适用于任何值,包括inf和nan。

npy_half npy_half_spacing(npy_half h)

对于半精度浮点,这与低级浮点部分中描述的npy_间距和npy_间距相同。

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。