NumPy 1.8.0 发行说明#

此版本支持 Python 2.6 -2.7 和 3.2 - 3.3。

强调

  • 新的,没有 2to3,Python 2 和 Python 3 由通用代码库支持。

  • 用于线性代数的新 gufuncs,支持对堆叠数组进行操作。

  • 使用该方法对 ufunc 进行新的就地索引.at

  • partition功能,通过选择快速中位数进行部分排序。

  • 新的、nanmeannanvar、 和nanstd函数跳过 NaN。

  • 用于创建值初始化数组的新full函数。full_like

  • 新的、PyUFunc_RegisterLoopForDescr更好的 ufunc 对用户数据类型的支持。

  • 许多领域的众多性能改进。

放弃支持#

对 Python 2.4 和 2.5 版本的支持已被删除,

对 SCons 的支持已被删除。

未来的变化#

Datetime64 类型在此版本中仍处于实验阶段。 1.9 中可能会进行一些更改以使其更可用。

对角线方法当前返回一个新数组并引发 FutureWarning。在 1.9 中它将返回只读视图。

当前,从结构化类型数组中选择多个字段会返回一个新数组并引发 FutureWarning。在 1.9 中它将返回只读视图。

numpy/oldnumeric 和 numpy/numarray 兼容性模块将在 1.9 中删除。

兼容性说明#

doc/sphinxext 内容已移至其自己的 github 存储库中,并作为子模块包含在 numpy 中。有关如何访问内容的信息,请参阅 doc/HOWTO_BUILD_DOCS.rst 中的说明。

numpy.void 标量的哈希函数已更改。以前,指向数据的指针被散列为整数。现在,哈希函数使用元组哈希算法来组合标量元素的哈希函数,但前提是标量是只读的。

Numpy 已将其构建系统切换为默认使用“单独编译”。在以前的版本中,这是支持的,但不是默认的。这应该会产生与旧系统相同的结果,但是如果您尝试执行一些复杂的操作,例如静态链接 numpy 或使用不寻常的编译器,那么您可能会遇到问题。如果是这样,请提交一个错误,作为临时解决方法,您可以通过导出 shell 变量 NPY_SEPARATE_COMPILATION=0 来重新启用旧的构建系统。

对于 AdvancedNew 迭代器,oa_ndim标志现在应该为 -1 以指示没有op_axesitershape被传入。这种 情况,现在指示 0 维迭代并且为 NULL,并且旧用法已被弃用。这不会影响或 功能。oa_ndim == 0op_axesNpyIter_NewNpyIter_MultiNew

函数 nanargmin 和 nanargmax 现在返回 np.iinfo['intp'].min 作为全 NaN 切片中的索引。以前,这些函数会在数组返回时引发 ValueError,在标量返回时引发 NaN。

NPY_RELAXED_STRIDES_CHECKING #

有一个新的编译时环境变量 NPY_RELAXED_STRIDES_CHECKING。如果这个变量设置为 1,那么 numpy 将认为更多的数组是 C 或 F 连续的——例如,可以有一个列向量同时被认为是 C 和 F 连续。新的定义更准确,允许更快的代码,减少不必要的副本,并在内部简化 numpy 的代码。但是,它也可能会破坏对 C 和 F 连续数组的步幅值做出过强假设的第三方库。 (目前还知道,这会破坏使用内存视图的 Cython 代码,这将在 Cython 中修复。)这将成为未来版本中的默认设置,因此请立即针对使用以下内容构建的 NUMPY 测试您的代码:

NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install

您可以通过运行以下命令来检查 NPY_RELAXED_STRIDES_CHECKING 是否有效:

np.ones((10, 1), order="C").flags.f_contiguous

这将是True如果启用宽松步幅检查, False否则。到目前为止,我们看到的典型问题是使用 C 连续数组的 C 代码,并假设可以通过查看数组中的最后一个元素来访问 itemsize PyArray_STRIDES(arr) 。当放松的步伐生效时,情况并非如此(事实上,在某些极端情况下,情况并非如此)。相反,使用 PyArray_ITEMSIZE(arr).

有关更多信息,请查看文档中的“ndarray 的内部内存布局”部分。

以非数组作为第二个参数的二元运算#

where声明的值高于 of 的形式的二元运算现在将无条件返回 NotImplemented,从而有机会处理该操作。以前,只有在实际实现了相反的操作并且尝试了(可能昂贵的)数组转换之后,才会返回 NotImplemented 。 (错误拉取请求<array-or-subclass> * <non-array-subclass><non-array-subclass>__array_priority__<array-or-subclass><non-array-subclass><non-array-subclass><non-array-subclass>

与overwrite_input一起使用的函数中位数仅对数组进行部分排序#

如果中位数与overwrite_input选项一起使用,则输入数组现在将仅部分排序而不是完全排序。

修复 Financial.npv #

npv 函数有一个错误。与文档所述相反,它从索引1toM而不是 from 0to求和。该修复更改​​了返回值。 mirr 函数调用了 npv 函数,但解决了该问题,因此该问题也得到了修复,并且 mirr 函数的返回值保持不变。M - 1

比较 NaN 数字时的运行时警告#

现在比较NaN浮点数会引发invalid运行时警告。如果NaN需要 a ,则可以使用 np.errstate 忽略警告。例如:

with np.errstate(invalid='ignore'):
    operation()

新功能

支持堆叠数组上的线性代数#

gufunc 机制现在用于 np.linalg,允许对堆叠数组和向量进行操作。例如:

>>> a
array([[[ 1.,  1.],
        [ 0.,  1.]],

       [[ 1.,  1.],
        [ 0.,  1.]]])

>>> np.linalg.inv(a)
array([[[ 1., -1.],
        [ 0.,  1.]],

       [[ 1., -1.],
        [ 0.,  1.]]])

为 ufuncs 建立精美索引#

该函数at已添加到 ufunc 对象中,以便在使用花式索引时允许就地使用 ufunc,而无需缓冲。例如,以下代码将递增数组中的第一项和第二项,并将第三项递增两次:numpy.add.at(arr, [0, 1, 2, 2], 1)

这是许多人错误地认为会做的事情,但这不起作用,因为递增的值只是两次复制到第三个槽中,而不是递增两次。arr[[0, 1, 2, 2]] += 1arr[2]arr

新函数partitionargpartition #

通过选择算法对数组进行部分排序的新函数。

partition按索引将最小元素k移动k到数组的前面。前面的所有元素k都小于或等于position 中的值k,后面的所有元素k都大于或等于position 中的值k。这些范围内的值的顺序是未定义的。可以提供一系列索引,以便在迭代分区时将所有索引排序到其排序位置。这可用于有效地获取订单统计信息,例如样本的中位数或百分位数。 partition具有线性时间复杂度,O(n)而完整排序具有 。O(n log(n))

新函数nanmeannanvarnanstd #

添加了新的 nan 感知统计函数。在这些函数中,如果从所有计算中省略 nan 值,将获得结果。

新函数fullfull_like #

用于创建填充特定值的数组的新便捷函数;与现有的ZerosZeros_like函数互补。

大文件的 IO 兼容性#

大于 2GB 的大型 NPZ 文件可以在 64 位系统上加载。

针对 OpenBLAS 进行构建#

现在可以通过编辑 site.cfg 针对 OpenBLAS 构建 numpy。

新常数#

欧拉常数现在在 numpy 中显示为 euler_gamma。

qr 的新模式#

新模式“完整”、“简化”和“原始”已添加到 qr 分解中,旧的“完整”和“经济”模式已被弃用。 “缩减”模式取代了旧的“完整”模式,并且与“完整”模式一样是默认模式,因此可以通过不指定模式来保持向后兼容性。

“完整”模式返回全维分解,这对于获得范围空间的正交补集的基础很有用。 “原始”模式返回包含 Householder 反射器和缩放因子的数组,这些数组可以在将来用于应用 q,而无需转换为矩阵。 “经济”模式已被弃用,它没有太多用处,而且并不比“原始”模式更有效。

in1d的新反转参数#

函数in1d现在接受一个invert参数,当该参数为True时,会导致返回的数组反转。

使用np.newaxis进行高级索引#

现在可以将np.newaxis / None与索引数组一起使用,而不仅仅是在简单索引中。这意味着 现在将按预期工作并选择前两行,同时在数组前面添加一个新轴。array[np.newaxis, [0, 1]]

C-API #

现在可以使用内置输入类型和自定义输出类型注册新的 ufunc。在此更改之前,当从 Python 调用 ufunc 时,NumPy 将无法找到正确的 ufunc 循环函数,因为 ufunc 循环签名匹配逻辑不查看输出操作数类型。现在,只要用户提供具有正确输出类型的输出参数,就可以找到正确的 ufunc 循环。

运行测试.py #

runtests.py添加了一个简单的测试运行脚本。它还通过构建 Numpy ,可用于在开发过程中轻松运行测试。setup.py build

改进#

IO 性能改进#

通过分块提高了读取大文件的性能(另请参阅 IO 兼容性)。

焊盘性能改进#

pad函数有一个新的实现,大大提高了除mode=之外的所有输入的性能(保留是为了向后兼容)。对于等级 >= 4,维度缩放得到显着改善。

isnanisinfisfinitebyteswap的性能改进#

isnanisinfisfinitebyteswap已得到改进,可以利用编译器内置函数来避免对 libc 的昂贵调用。在 gnu libc 系统上,这将这些操作的性能提高了大约两倍。

通过 SSE2 矢量化提高性能#

多项功能已针对 SSE2 CPU SIMD 指令的使用进行了优化。

  • Float32 和 float64:
    • 基础数学(

    • 开方

    • 最小值/最大值

    • 绝对

  • 布尔:
    • 逻辑或

    • 逻辑与

    • 逻辑非

这使得这些操作的性能对于 float32/float64 提高了 4 倍/2 倍,对于 bool 提高了 10 倍,具体取决于 CPU 缓存中数据的位置。就地操作的性能增益最大。

为了使用改进的功能,必须在编译时启用 SSE2 指令集。它在 x86_64 系统上默认启用。在具有功能 CPU 的 x86_32 上,必须通过将适当的标志传递给 CFLAGS 构建变量(带有 gcc 的 -msse2)来启用它。

性能提升至中位数#

现在中位数是根据分区而不是排序来实现的,这将其时间复杂度从 O(n log(n)) 降低到 O(n)。如果与overwrite_input选项一起使用,数组现在将仅部分排序,而不是完全排序。

ufunc C-API 中可重写的操作数标志#

创建 ufunc 时,可以通过 ufunc 对象的新 op_flags 属性覆盖默认的 ufunc 操作数标志。例如,要将第一个输入的操作数标志设置为读/写:

PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;

这允许 ufunc 就地执行操作。此外,全局 nditer 标志可以通过 ufunc 对象的新 iter_flags 属性覆盖。例如,要为 ufunc 设置归约标志:

ufunc->iter_flags = NPY_ITER_REDUCE_OK;

变化

一般的

函数 np.take 现在允许 0 维数组作为索引。

现在默认启用单独编译模式。

np.insert 和 np.delete 的一些更改:

  • 以前,负索引和指向数组末尾的索引被简单地忽略。现在,这将引发未来或弃用警告。将来,它们将像普通索引一样对待——负索引将环绕,而越界索引将产生错误。

  • 以前,布尔索引被视为整数(始终指数组中的第 0 项或第 1 项)。未来,它们将被视为口罩。在此版本中,他们针对即将发生的变化提出了 FutureWarning 警告。

  • 在 Numpy 1.7 中。 np.insert 已经允许语法 np.insert(arr, 3, [1,2,3])在单个位置插入多个项目。在 Numpy 1.8 中。这对于np.insert(arr, [3], [1, 2, 3])也是可能的。

np.pad 中的填充区域现在可以正确舍入,而不是截断。

C-API 数组添加#

数组 C-API 中添加了四个新函数。

  • PyArray_分区

  • PyArray_ArgPartition

  • PyArray_SelectkindConverter

  • PyDataMem_NEW_ZEROED

C-API Ufunc 添加#

ufunc C-API 中添加了一个新函数,允许使用 descr 为用户类型注册内部循环。

  • PyUFunc_RegisterLoopF​​orDecr

C-API 开发人员改进#

实例PyArray_Type创建函数tp_new现在用于tp_basicsize确定要分配多少内存。在以前的版本中,仅sizeof(PyArrayObject)分配了字节内存,通常需要 C-API 子类型来重新实现tp_new.

弃用#

qr 分解的“完整”和“经济”模式已被弃用。

一般的

不推荐使用非整数作为索引和大多数整数参数。以前,浮点索引和函数参数(例如轴或形状)会在没有警告的情况下被截断为整数。例如, arr.reshape(3., -1)arr[0.]将在 NumPy 1.8 中触发弃用警告,并且在 NumPy 的某些未来版本中它们将引发错误。

作者#

此版本包含以下人员的工作,他们至少为此版本贡献了一个补丁。这些名字按名字的字母顺序排列:

  • 87

  • 亚当·金斯伯格 +

  • 亚当·格里菲斯 +

  • 亚历山大·别洛波尔斯基 +

  • 亚历克斯·巴特+

  • 亚历克斯·福特+

  • 安德烈亚斯·希尔博尔 +

  • 安德烈亚斯·克勒克纳 +

  • 安德烈亚斯·施瓦布 +

  • 安德鲁·霍顿 +

  • 格里芬+

  • 阿林克·维尔马 +

  • 巴戈·阿米尔拜基安 +

  • 巴托什·泰伦茨祖克 +

  • 贝伯特218 +

  • 本杰明·鲁特 +

  • 比尔·斯波茨+

  • 布拉德利·弗勒尔

  • 卡温·佩利 +

  • 查尔斯·哈里斯

  • 克里斯

  • 克里斯蒂安·布鲁弗 +

  • 克里斯托夫·丹恩 +

  • 克里斯托夫·戈尔克

  • 丹·希普施曼 +

  • 丹尼尔+

  • 丹·米勒 +

  • 戴维戴维400 +

  • 大卫·库纳波

  • 大卫·沃德-法利

  • 丹尼斯·拉萨尔德

  • 德缪尔纳 +

  • 爱德华·卡特穆尔 +

  • 叶戈尔·辛迪 +

  • 内石

  • 埃里克·法林

  • 埃里克·福德

  • 埃里克·摩尔 +

  • 埃里克·普莱斯 +

  • 法兹鲁尔·沙赫里亚尔 +

  • 菲利克斯·哈特曼 +

  • 费尔南多·佩雷斯

  • 弗兰克·B+

  • 弗兰克·百年灵 +

  • 弗雷德里克

  • 加布里埃尔

  • 盖尔·瓦罗夸

  • 纪尧姆·盖伊 +

  • 汉·杰努特

  • 哈罗德·米尔斯 +

  • 克雷姆+

  • 詹姆斯·韦伯 +

  • 杰森·马登 +

  • 杰·布尔克

  • 杰罗梅凯莱赫 +

  • 赫苏斯·戈麦斯 +

  • 杰莫兹莫兹 +

  • 诺斯曼+

  • 约翰内斯·勋伯格 +

  • 约翰·贝内迪克松 +

  • 约翰·萨尔瓦蒂埃 +

  • 约翰·施特舒尔特 +

  • 乔纳森·沃尔特曼 +

  • 俊路+

  • 何塞·德·克洛 +

  • 约瑟夫·马蒂诺·拉加德 +

  • 乔什·华纳 (Mac) +

  • 乔斯坦·博·弗洛伊斯塔德 +

  • 胡安·路易斯·卡诺·罗德里格斯 +

  • 朱利安·泰勒 +

  • 朱利安·法利普 +

  • K.-迈克尔·埃 +

  • 库马尔·阿帕亚 +

  • 拉尔斯·布廷克

  • 莱昂·韦伯 +

  • 路易斯·佩德罗·科埃略

  • 马尔辛·尤什凯维奇

  • 马克·韦伯

  • 马丁·范·科奎克 +

  • 马丁·鲍姆尔 +

  • 马丁·斯派塞克

  • 马丁·泰希曼 +

  • 马特·戴维斯 +

  • 马修·布雷特

  • 马克西米利安·阿尔伯特 +

  • MDW+

  • 迈克尔·德鲁特布姆

  • MWtoews +

  • 纳撒尼尔·史密斯

  • 尼古拉斯·谢弗 +

  • 尼尔斯·维尔纳 +

  • 奥乔达维德 +

  • 翁德热·切尔蒂克

  • 奥维拉斯+

  • 保罗·伊万诺夫

  • 保利·维尔塔宁

  • 彼得杰克

  • 拉尔夫·戈默斯

  • 劳尔·科塔 +

  • 理查德·哈特斯利 +

  • 罗伯特·科斯塔 +

  • 罗伯特·科恩

  • 罗布·鲁阿纳 +

  • 罗南·拉米

  • 桑德罗·托西

  • 萨沙·佩里克 +

  • 塞巴斯蒂安·伯格

  • 船长西博尔德

  • 斯特凡·范德沃尔特

  • 史蒂夫+

  • 新垣隆文 +

  • 托马斯·罗比泰耶 +

  • 托马斯·托梅切克 +

  • 特拉维斯·奥利芬特

  • 瓦伦丁·哈内尔

  • 弗拉基米尔·鲁茨基 +

  • 沃伦·韦克瑟

  • 雅罗斯拉夫·哈尔琴科

  • 尤里·V·扎伊采夫 +

共有 119 人为本次发布做出了贡献。名字带有“+”的人首次贡献了补丁。