NumPy 1.11.0 发行说明#

此版本支持 Python 2.6 - 2.7 和 3.2 - 3.5,并包含许多增强和改进.另请注意下面列出的构建系统更改,因为它们可能会产生细微的影响.

由于工具链损坏,此版本不提供 Windows (TM) 二进制文件.Windows (TM) Python 包的提供商之一是您的最佳选择.

亮点#

这些改进的详细信息如下.

  • datetime64 类型现在是时区无关的.

  • randint 中添加了一个 dtype 参数.

  • 改进了对可能共享内存的两个数组的检测.

  • np.histogram 的自动 bin 大小估计.

  • A @ A.T 和 dot(A, A.T) 的速度优化.

  • 用于重新排序数组轴的新函数 np.moveaxis .

构建系统更改#

  • Numpy 现在使用 setuptools 进行构建,而不是普通的 distutils.这修复了依赖 Numpy 的项目的 setup.py 文件中使用 install_requires='numpy' 的问题(参见 gh-6551).但它可能会影响 Numpy 本身的构建/安装方法的行为.请在 Numpy 问题跟踪器上报告任何意外的行为.

  • Bento 构建支持和相关文件已删除.

  • 单文件构建支持和相关文件已删除.

未来变化#

以下更改计划用于 Numpy 1.12.0.

  • 将删除对 Python 2.6,3.2 和 3.3 的支持.

  • 宽松的步幅检查将成为默认设置.有关此更改含义的更广泛讨论,请参见 1.8.0 发行说明.

  • datetime64 "非时间"(NaT)值的行为将更改为与浮点"非数字"(NaN)值相匹配:所有涉及 NaT 的比较都将返回 False,除非 NaT != NaT,它将返回 True.

  • 使用浮点数进行索引将引发 IndexError,例如,a[0, 0.0].

  • 使用非整数 array_like 进行索引将引发 IndexError ,例如, a['1', '2']

  • 使用多个省略号进行索引将引发 IndexError ,例如, a[..., ...] .

  • 用作索引值的非整数将引发 TypeError ,例如,在 reshape , take 和指定 reduce axis 中.

在未来的版本中,将进行以下更改.

  • numpy.testing 中公开的 rand 函数将被删除.该函数是从早期的 Numpy 中遗留下来的,并且是使用 Python random 模块实现的.应该使用 numpy.random 中的随机数生成器.

  • ndarray.view 方法将只允许 c_contiguous 数组使用不同大小的 dtype 进行查看,从而导致最后一个维度发生变化.这与当前的行为不同,当前的行为是 f_contiguous 但不是 c_contiguous 的数组可以被视为不同大小的 dtype 类型,从而导致第一个维度发生变化.

  • 切片 MaskedArray 将返回数据和掩码的视图.当前,掩码是写时复制的,并且切片中对掩码的更改不会传播到原始掩码.有关详细信息,请参见下面的 FutureWarnings 部分.

兼容性说明#

datetime64 更改#

在 NumPy 的早期版本中,实验性的 datetime64 类型总是以 UTC 存储时间.默认情况下,从字符串创建 datetime64 对象或打印它会从本地时间转换或转换为本地时间:

# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00

datetime64 用户达成共识,认为这种行为是不希望的,并且与 datetime64 的常用方式(例如,通过 pandas )不一致.对于大多数用例,首选时区无关的 datetime 类型,类似于 Python 标准库中的 datetime.datetime 类型.因此,datetime64 不再假定输入为本地时间,也不再打印本地时间:

>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00')

为了向后兼容,datetime64 仍然解析时区偏移量,它通过转换为 UTC 来处理这些偏移量.但是,生成的 datetime 是时区无关的:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00')

作为此更改的必然结果,我们不再禁止在具有日期单位的 datetime 和具有时间单位的 datetime 之间进行转换.使用时区无关的 datetime,从日期转换为时间的规则不再模棱两可.

linalg.norm 返回类型更改#

linalg.norm 函数的返回类型现在是浮点数,没有任何例外.一些范数类型以前返回整数.

多项式拟合的更改#

numpy polynomial 包中的各种拟合函数不再接受非整数作为度数规范.

np.dot 现在引发 TypeError 而不是 ValueError#

此行为模仿了其他函数(如 np.inner )的行为.如果两个参数不能强制转换为公共类型,则可能会根据它们的顺序引发 TypeErrorValueError .现在, np.dot 将始终引发 TypeError .

针对已更改行为的 FutureWarning#

  • np.lib.split 中,结果中的空数组始终具有维度 (0,) ,无论正在拆分的数组的维度如何.现在已更改此设置,以便保留维度.自 Numpy 1.9 以来,此更改的 FutureWarning 一直存在,但由于一个错误,有时不会引发警告,并且已经保留了维度.

%// 运算符#

这些运算符分别使用 remainderfloor_divide 函数实现. 现在,这些函数基于 fmod ,并且一起计算,以便彼此兼容并与浮点类型的 Python 版本兼容. 与先前的结果相比,结果应该稍微更准确或完全是错误修复,但是在舍入对 floor_divide 返回的整数产生影响的情况下,它们可能会有很大差异. 一些极端情况也会发生变化,例如,当除数为零时,始终为两个函数返回 NaN, divmod(1.0, inf) 返回 (0.0, 1.0) (MSVC 2008 除外),并且 divmod(-1.0, inf) 返回 (-1.0, inf) .

C API#

删除了 PyUFuncObject 结构的 check_returninner_loop_selector 成员(用 reserved 插槽替换它们以保留结构布局).这些成员从未用于任何用途,因此第三方代码也不太可能使用它们,但为了完整起见,我们在此处提及它.

用于旧式类的对象 dtype 检测#

在 python 2 中,作为旧式用户定义类的实例的对象不再在 dtype-detection 处理程序中自动计为"对象"类型. 相反,与 python 3 中一样,它们可能会被视为序列,但前提是它们定义了 __len__ ` 和 `__ getitem__ 方法.这修复了 python 2 和 3 之间的段错误和不一致.

新特性#

  • np.histogram 现在提供插件估计器,用于自动估计最佳的 bin 数量. 将 [‘auto’, ‘fd’, ‘scott’, ‘rice’, ‘sturges’] 之一作为 ‘bins’ 的参数传递,将导致使用相应的估计器.

  • 已添加使用 Airspeed Velocity 的基准测试套件,转换了以前基于 vbench 的基准测试套件. 您可以通过 python runtests.py --bench 在本地运行该套件. 有关更多详细信息,请参见 benchmarks/README.rst .

  • 添加了一个新函数 np.shares_memory ,可以准确地检查两个数组是否具有内存重叠. np.may_share_memory 现在也具有一个选项,可以花费更多精力来减少误报.

  • SkipTestKnownFailureException 异常类在 numpy.testing 命名空间中公开.在测试函数中引发它们以将测试标记为跳过或将其标记为已知失败.

  • f2py.compile 具有一个新的 extension 关键字参数,该参数允许为生成的临时文件指定 fortran 扩展名.例如,可以将文件指定为 *.f90 . verbose 参数也被激活,以前被忽略.

  • 已向 np.random.randint 添加了 dtype 参数.现在可以生成以下类型的随机 ndarray:

    • np.bool_ ,

    • np.int8 , np.uint8 ,

    • np.int16 , np.uint16 ,

    • np.int32 , np.uint32 ,

    • np.int64 , np.uint64 ,

    • np.int_ `` , ``np.intp

    该规范按精度指定,而不是按 C 类型指定.因此,在某些平台上,即使指定的 dtype 为 long long , np.int64 也可能是 long 而不是 long long ,因为两者可能具有相同的精度.结果类型取决于 numpy 用于给定精度的 C 类型.字节顺序规范也被忽略,生成的数组始终采用本机字节顺序.

  • 一个新的 np.moveaxis 函数允许通过显式提供源轴和目标轴,将一个或多个数组轴移动到新的位置.这个函数应该比当前的 rollaxis 函数更容易使用,并且提供更多的功能.

  • 各种 numpy.polynomial 拟合的 deg 参数已经扩展为接受要包含在拟合中的项的度数列表,所有其他项的系数被约束为零.该更改是向后兼容的,传递标量 deg 将像以前一样工作.

  • 一个用于浮点类型的 divmod 函数,模仿 Python 版本,已被添加到 npy_math 库.

改进#

np.gradient 现在支持 axis 参数#

为了保持一致性, axis 参数已添加到 np.gradient 中.它允许指定计算梯度的轴.

np.lexsort 现在支持具有对象数据类型的数组#

当类型未实现合并排序类型的 argsort 方法时,该函数现在在内部调用通用 npy_amergesort .

np.ma.core.MaskedArray 现在支持 order 参数#

在构造一个新的 MaskedArray 实例时,可以使用类似于调用 np.ndarray 时的 order 参数来配置它.添加此参数允许在几个 MaskedArray 相关的实用函数中正确处理 order 参数,例如 np.ma.core.arraynp.ma.core.asarray .

屏蔽数组的内存和速度改进#

现在使用 np.ones (resp. np.zeros ) 创建 mask=True (resp. mask=False ) 的屏蔽数组来创建掩码,这更快并且避免了大的内存峰值. 另一个优化是为了避免在打印屏蔽数组时出现内存峰值和无用的计算.

ndarray.tofile 现在在 Linux 上使用 fallocate#

该函数现在使用 fallocate 系统调用在支持它的文件系统上预留足够的磁盘空间.

A.T @ AA @ A.T 形式的操作进行了优化#

以前, gemm BLAS 操作用于所有矩阵乘积. 现在,如果矩阵乘积是矩阵及其转置之间的运算,它将使用 syrk BLAS 操作来提高性能. 此优化已扩展到 @ , numpy.dot , numpy.innernumpy.matmul .

注意:需要转置和非转置矩阵共享数据.

np.testing.assert_warns 现在可以用作上下文管理器#

这与 assert_raises 的行为相匹配.

np.random.shuffle 的速度提升#

np.random.shuffle 现在对于 1d ndarray 快得多.

变更#

Pyrex 支持已从 numpy.distutils 中移除#

方法 build_src.generate_a_pyrex_source 将仍然可用;它已被用户 monkeypatch 以支持 Cython 而不是 Pyrex. 但建议切换到更好的支持方式来构建 Cython 扩展.

np.broadcast 现在可以用单个参数调用#

在这种情况下,生成的对象将简单地模仿对单个数组的迭代.此更改使如下区分变得过时:

if len(x) == 1:

shape = x[0].shape

else:

shape = np.broadcast(x).shape

相反, np.broadcast 可以在所有情况下使用.

np.trace 现在尊重数组子类#

此行为模仿其他函数(如 np.diagonal )的行为,并确保,例如,对于屏蔽数组, np.trace(ma)ma.trace() 给出相同的结果.

np.dot 现在引发 TypeError 而不是 ValueError#

此行为模仿了其他函数(如 np.inner )的行为.如果两个参数不能强制转换为公共类型,则可能会根据它们的顺序引发 TypeErrorValueError .现在, np.dot 将始终引发 TypeError .

linalg.norm 返回类型更改#

linalg.norm 函数现在以浮点数执行所有计算并返回浮点结果. 此更改修复了由整数溢出以及 abs 与最小值的有符号整数(例如,int8(-128))的失败引起的错误. 为了保持一致性,即使整数可能有效,也使用浮点数.

弃用#

Fortran 顺序的数组视图#

F_CONTIGUOUS 标志用于指示使用更改元素大小的 dtype 的视图将更改第一个索引. 对于既是 F_CONTIGUOUS 又是 C_CONTIGUOUS 的数组,这始终存在问题,因为 C_CONTIGUOUS 优先. 放松的步幅检查导致更多这样的双重连续数组,并因此破坏了一些现有代码. 请注意,这也影响通过分配给数组的 dtype 属性来更改 dtype. 此弃用的目的是在将来的某个时间将视图限制为 C_CONTIGUOUS 数组. 一种向后兼容的解决方法是使用 a.T.view(...).T 代替. 也可以将参数添加到 view 方法以显式请求 Fortran 顺序视图,但这将不向后兼容.

数组排序的无效参数#

目前可以为 order 参数传递参数,比如在 array.flattenarray.ravel 等方法中,这些参数不是以下之一:’C’,’F’,’A’,’K’(请注意,所有这些可能的值都是 Unicode 且不区分大小写).未来版本将不允许这种行为.

testing 命名空间中的随机数生成器#

Python 标准库随机数生成器之前在 testing 命名空间中公开为 testing.rand . 不建议使用此生成器,并且将在以后的版本中将其删除. 请改用 numpy.random 命名空间中的生成器.

闭区间的随机整数生成#

根据 Python C API,它优先选择半开区间而不是闭区间,因此 np.random.random_integers 已被弃用,转而调用 np.random.randint ,后者已通过 dtype 参数进行了增强,如"新功能"中所述. 但是, np.random.random_integers 不会很快被删除.

FutureWarnings#

赋值给 MaskedArray 的切片/视图#

当前,masked 数组的切片包含原始数据的视图和 mask 的写时复制视图. 因此,对切片的 mask 的任何更改都将导致创建原始 mask 的副本并更改该新 mask,而不是原始 mask. 例如,如果我们像这样创建原始切片, view = original[:] ,那么对一个数组中的数据进行修改会影响另一个数组的数据,但是,由于 mask 将在赋值操作期间被复制,因此对 mask 的更改将保留在本地. 当使用 MaskedArray(data, mask) 显式构造一个 masked 数组时,也会发生类似的情况,返回的数组将包含 data 的视图,但 mask 将是 mask 的写时复制视图.

将来,这些情况将被标准化,以便数据和 mask 数组以相同的方式处理,并且对任一数组的修改将在视图之间传播. 在 1.11 中,numpy 将在用户代码修改视图的 mask 时发出 MaskedArrayFutureWarning 警告,这在将来可能会导致值传播回原始对象. 要消除这些警告并使你的代码对即将到来的更改具有鲁棒性,你有两个选择:如果你想保持当前的行为,请在修改 mask 之前调用 masked_view.unshare_mask() . 如果你想尽早获得未来的行为,请使用 masked_view._sharedmask = False . 但是,请注意,设置 _sharedmask 属性会破坏随后对 masked_view.unshare_mask() 的显式调用.