NumPy 1.11.0 发行说明#

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

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

亮点#

这些改进的详细信息可以在下面找到.

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

  • 一个 dtype 参数已添加到 randint .

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

  • 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].

  • 使用非整数类数组进行索引将引发 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 将会返回data和mask的视图.当前,掩码是写时复制的,并且切片中对掩码的更改不会传播到原始掩码.有关详细信息,请参见下面的 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 包中的各种拟合函数不再接受非整数作为 degree 说明符.

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 检测处理程序中的“对象”类型.相反,与 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 将按以前的方式运行.

  • npy_math 库添加了一个浮点类型的 divmod 函数,该函数以 Python 版本为模型.

改进#

np.gradient 现在支持 axis 参数#

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

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

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

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

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

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

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

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 的速度#

现在,对于一维 ndarray, np.random.shuffle 快得多.

变更#

numpy.distutils 中删除了 Pyrex 支持#

方法 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 函数现在以浮点数执行所有计算,并返回浮点结果. 此更改修复了由于整数溢出以及带符号整数的最小值(例如,int8(-128))的 abs 失败而导致的错误.为了保持一致性,即使可以使用整数,也使用浮点数.

弃用#

Fortran 顺序的数组视图#

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

数组排序的无效参数#

目前,可以在 array.flattenarray.ravel 等方法中为 order 参数传入以下值以外的参数:’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 array 的切片包含原始数据的视图和写时复制的掩码视图.因此,对切片的掩码的任何更改都将导致创建原始掩码的副本并更改该新掩码,而不是原始掩码.例如,如果我们像这样创建一个原始切片 view = original[:] ,那么对一个数组中的数据进行修改将影响另一个数组的数据,但是,由于掩码将在赋值操作期间被复制,因此对掩码的更改将保留在本地.当使用 MaskedArray(data, mask) 显式构造 masked array 时,也会发生类似的情况,返回的数组将包含 data 的视图,但掩码将是 mask 的写时复制视图.

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