NumPy 1.8.0 发行说明#

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

亮点#

  • 新增,无需 2to3,通用代码库支持 Python 2 和 Python 3.

  • 新增,用于线性代数的 gufunc,支持对堆叠数组进行运算.

  • 新增,使用 .at 方法对 ufunc 进行原地 fancy 索引.

  • 新增, partition 函数,通过选择进行部分排序以实现快速中值.

  • 新增,跳过 NaN 的 nanmean , nanvarnanstd 函数.

  • 新增, fullfull_like 函数,用于创建值初始化的数组.

  • 新增, PyUFunc_RegisterLoopForDescr ,更好地支持用户 dtypes 的 ufunc.

  • 许多领域的性能改进.

放弃支持#

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

已删除对 SCons 的支持.

未来变化#

Datetime64 类型在此版本中仍然是实验性的.在 1.9 中,可能会对其进行一些更改,使其更易于使用.

diagonal 方法当前返回一个新数组并引发 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 或使用不常见的编译器之类的复杂操作,则可能会遇到问题.如果是这样,请提交一个 bug,并且作为临时解决方法,可以通过导出 shell 变量 NPY_SEPARATE_COMPILATION=0 来重新启用旧的构建系统.

对于 AdvancedNew 迭代器, oa_ndim 标志现在应为 -1,以指示未传入任何 op_axesitershape . oa_ndim == 0 的情况,现在指示 0-D 迭代,并且 op_axes 为 NULL,并且不建议使用旧用法.这不会影响 NpyIter_NewNpyIter_MultiNew 函数.

函数 nanargmin 和 nanargmax 现在为所有 NaN 切片中的np.iinfo[‘intp’].min 返回索引.以前,这些函数对于数组返回值会引发 ValueError,对于标量返回值会引发 NaN.

NPY_RELAXED_STRIDES_CHECKING#

有一个新的编译时环境变量 NPY_RELAXED_STRIDES_CHECKING .如果此变量设置为 1,则 numpy 会认为更多的数组是 C 或 F 连续的 – 例如,它可以同时拥有被认为是 C 和 F 连续的列向量.新的定义更准确,允许更快的代码,减少不必要的复制,并简化 numpy 的内部代码.但是,它也可能会破坏对 C 和 F 连续数组的步幅值做出过于强烈假设的第三方库.(目前已知这会破坏使用 memoryviews 的 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 代码,并且假设可以通过查看 PyArray_STRIDES(arr) 数组中的最后一个元素来访问 itemsize.当宽松步幅生效时,这是不正确的(事实上,在某些极端情况下,它从来都不是正确的).相反,请使用 PyArray_ITEMSIZE(arr) .

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

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

<array-or-subclass> * <non-array-subclass> 形式的二元运算,其中 <non-array-subclass> 声明的 __array_priority__ 高于 <array-or-subclass> ,现在将无条件地返回 NotImplemented,从而使 <non-array-subclass> 有机会处理该运算.以前,只有在 <non-array-subclass> 实际实现了反向运算,并且在尝试对 <non-array-subclass> 进行(可能代价高昂的)数组转换之后,才会返回 NotImplemented . ( bug , pull request )

带有 overwrite_input 的函数 median 仅对数组进行部分排序#

如果 medianoverwrite_input 选项一起使用,则输入数组现在只会进行部分排序,而不是完全排序.

修复 financial.npv#

npv 函数存在一个 bug.与文档的说明相反,它从索引 1M 求和,而不是从 0M - 1 .此修复更改了返回值.mirr 函数调用了 npv 函数,但解决了该问题,因此也对其进行了修复,mirr 函数的返回值保持不变.

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

比较 NaN 浮点数现在会引发 invalid 运行时警告.如果期望出现 NaN ,则可以使用 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.]]])

用于 ufunc 的原地花式索引#

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

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

新函数 partitionargpartition#

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

按索引 k 进行 partition 会将 k 个最小的元素移动到数组的前面.然后, k 之前的所有元素都小于或等于位置 k 中的值,并且 k 之后的所有元素都大于或等于位置 k 中的值.这些边界内的值的顺序未定义.可以提供一系列索引,以一次将所有索引排序到其排序后的位置,从而进行迭代分区.这可以用于有效地获得样本的顺序统计量,如中位数或百分位数. partition 具有 O(n) 的线性时间复杂度,而完全排序具有 O(n log(n)) .

新函数 nanmean , nanvarnanstd#

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

新函数 fullfull_like#

创建填充特定值的数组的新方便函数;是对现有 zeroszeros_like 函数的补充.

与大文件的 IO 兼容性#

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

针对 OpenBLAS 构建#

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

新常量#

欧拉常数现在在 numpy 中作为 euler_gamma 公开.

qr 的新模式#

新模式 ‘complete’,’reduced’ 和 ‘raw’ 已添加到 qr 分解中,旧的 ‘full’ 和 ‘economic’ 模式已弃用."reduced"模式取代了旧的"full"模式,并且是默认模式,就像"full"模式一样,因此可以通过不指定模式来保持向后兼容性.

‘complete’ 模式返回完整维度的分解,这对于获得范围空间的正交补的基础可能很有用."raw"模式返回包含 Householder 反射器和比例因子的数组,将来可以使用这些数组来应用 q,而无需转换为矩阵."economic"模式已被弃用,它没有太大的用处,并且不比"raw"模式更有效.

in1d 的新 invert 参数#

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

使用 np.newaxis 的高级索引#

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

C-API#

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

runtests.py#

添加了一个简单的测试运行器脚本 runtests.py .它还通过 setup.py build 构建 Numpy,并且可以在开发期间轻松运行测试.

改进#

IO 性能改进#

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

pad 的性能改进#

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

isnan , isinf , isfinitebyteswap 的性能改进#

isnan , isinf , isfinitebyteswap 已经过改进,可以利用编译器内置函数来避免昂贵的 libc 调用.这使这些操作在 gnu libc 系统上的性能提高了大约两倍.

通过 SSE2 向量化提高性能#

几个函数已经过优化,可以利用 SSE2 CPU SIMD 指令.

  • Float32 和 float64:
    • 基本数学运算( add , subtract , divide , multiply )

    • sqrt

    • minimum/maximum

    • absolute

  • Bool:
    • logical_or

    • logical_and

    • logical_not

这使这些操作的性能提高了高达 4x/2x(对于 float32/float64)和高达 10x(对于 bool),具体取决于数据在 CPU 缓存中的位置.对于就地操作,性能提升最大.

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

median 的性能改进#

median 现在使用 partition 而不是 sort 来实现,这将其时间复杂度从 O(n log(n)) 降低到 O(n).如果与 overwrite_input 选项一起使用,则数组现在将仅部分排序,而不是完全排序.

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

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

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

这允许 ufunc 执行原地操作. 此外,全局 nditer 标志可以通过 ufunc 对象的新属性 iter_flags 来重写. 例如,要为 ufunc 设置 reduce 标志:

ufunc->iter_flags = NPY_ITER_REDUCE_OK;

变更#

常规#

函数 np.take 现在允许 0-d 数组作为索引.

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

np.insertnp.delete 的一些更改:

  • 以前,负索引和指向数组末尾后的索引会被简单地忽略.现在,这将引发 Future 或 Deprecation Warning.将来,它们将被视为正常的索引处理方式–负索引将环绕,超出范围的索引将生成错误.

  • 以前,布尔索引被视为整数(总是引用数组中的第 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_Partition

  • PyArray_ArgPartition

  • PyArray_SelectkindConverter

  • PyDataMem_NEW_ZEROED

C-API Ufunc 添加#

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

  • PyUFunc_RegisterLoopForDescr

C-API 开发人员改进#

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

弃用#

qr 分解的 "full" 和 "economic" 模式已被弃用.

常规#

不使用整数作为索引和大多数整数参数的做法已被弃用. 以前,浮点索引和函数参数(例如轴或形状)会被截断为整数而不发出警告. 例如, arr.reshape(3., -1)arr[0.] 将在 NumPy 1.8 中触发弃用警告,并且在 NumPy 的未来版本中,它们将引发错误.

作者#

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

  • 87

  • Adam Ginsburg +

  • Adam Griffiths +

  • Alexander Belopolsky +

  • Alex Barth +

  • Alex Ford +

  • Andreas Hilboll +

  • Andreas Kloeckner +

  • Andreas Schwab +

  • Andrew Horton +

  • argriffing +

  • Arink Verma +

  • Bago Amirbekian +

  • Bartosz Telenczuk +

  • bebert218 +

  • Benjamin Root +

  • Bill Spotz +

  • Bradley M. Froehle

  • Carwyn Pelley +

  • Charles Harris

  • Chris

  • Christian Brueffer +

  • Christoph Dann +

  • Christoph Gohlke

  • Dan Hipschman +

  • Daniel +

  • Dan Miller +

  • daveydave400 +

  • David Cournapeau

  • David Warde-Farley

  • Denis Laxalde

  • dmuellner +

  • Edward Catmur +

  • Egor Zindy +

  • endolith

  • Eric Firing

  • Eric Fode

  • Eric Moore +

  • Eric Price +

  • Fazlul Shahriar +

  • Félix Hartmann +

  • Fernando Perez

  • Frank B +

  • Frank Breitling +

  • Frederic

  • Gabriel

  • GaelVaroquaux

  • Guillaume Gay +

  • Han Genuit

  • HaroldMills +

  • hklemm +

  • jamestwebber +

  • Jason Madden +

  • Jay Bourque

  • jeromekelleher +

  • Jesús Gómez +

  • jmozmoz +

  • jnothman +

  • Johannes Schönberger +

  • John Benediktsson +

  • John Salvatier +

  • John Stechschulte +

  • Jonathan Waltman +

  • Joon Ro +

  • Jos de Kloe +

  • Joseph Martinot-Lagarde +

  • Josh Warner (Mac) +

  • Jostein Bø Fløystad +

  • Juan Luis Cano Rodríguez +

  • Julian Taylor +

  • Julien Phalip +

  • K.-Michael Aye +

  • Kumar Appaiah +

  • Lars Buitinck

  • Leon Weber +

  • Luis Pedro Coelho

  • Marcin Juszkiewicz

  • Mark Wiebe

  • Marten van Kerkwijk +

  • Martin Baeuml +

  • Martin Spacek

  • Martin Teichmann +

  • Matt Davis +

  • Matthew Brett

  • Maximilian Albert +

  • m-d-w +

  • Michael Droettboom

  • mwtoews +

  • Nathaniel J. Smith

  • Nicolas Scheffer +

  • Nils Werner +

  • ochoadavid +

  • Ondřej Čertík

  • ovillellas +

  • Paul Ivanov

  • Pauli Virtanen

  • peterjc

  • Ralf Gommers

  • Raul Cota +

  • Richard Hattersley +

  • Robert Costa +

  • Robert Kern

  • Rob Ruana +

  • Ronan Lamy

  • Sandro Tosi

  • Sascha Peilicke +

  • Sebastian Berg

  • Skipper Seabold

  • Stefan van der Walt

  • Steve +

  • Takafumi Arakaki +

  • Thomas Robitaille +

  • Tomas Tomecek +

  • Travis E. Oliphant

  • Valentin Haenel

  • Vladimir Rutsky +

  • Warren Weckesser

  • Yaroslav Halchenko

  • Yury V. Zaytsev +

总共有 119 人为这个版本做出了贡献.名字后面带有"+"的人是首次贡献补丁.