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 轴时。
在未来的版本中将进行以下更改。
将移除
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 函数的返回类型现在是浮点数,没有任何例外。一些范数类型以前返回整数。
polynomial fit 更改#
numpy polynomial 包中的各种 fit 函数不再接受非整数作为 degree 规范。
np.dot 现在引发 TypeError 而不是 ValueError#
这种行为模仿了 np.inner 等其他函数。如果两个参数无法转换为公共类型,则可能引发 TypeError 或 ValueError,具体取决于它们的顺序。现在,np.dot 将始终引发 TypeError。
FutureWarning 变为行为更改#
在
np.lib.split中,结果中的空数组的维度始终为(0,),而不管被分割数组的维度如何。现已更改为保留维度。自 Numpy 1.9 起,此更改的FutureWarning已生效,但由于一个 bug,有时不会发出警告,并且维度已经被保留。
% 和 // 运算符#
这些运算符分别使用 remainder 和 floor_divide 函数实现。这些函数现在基于 fmod,并一起计算,以兼容彼此以及浮点类型的 Python 版本。结果应该比以前的结果更精确或完全是 bug 修复,但在舍入误差会影响 floor_divide 返回的整数的情况下,它们可能会有显著差异。一些边界情况也发生了变化,例如,当除数为零时,两个函数始终返回 NaN,divmod(1.0, inf) 返回 (0.0, 1.0)(MSVC 2008 除外),而 divmod(-1.0, inf) 返回 (-1.0, inf)。
C API#
移除了 PyUFuncObject 结构中的 check_return 和 inner_loop_selector 成员(用 reserved 插槽替换它们以保留结构布局)。这些成员从未被使用过,因此第三方代码也不太可能使用它们,但我们在此提及以求完整。
旧式类的 object dtype 检测#
在 Python 2 中,旧式用户定义类的实例对象不再自动被视为 dtype 检测处理程序中的“object”类型。相反,与 Python 3 一样,它们可能被视为序列,但前提是它们定义了 __len__ 和 __getitem__ 方法。这修复了一个段错误以及 Python 2 和 3 之间的不一致。
新功能#
np.histogram现在提供插件估算器来自动估计最佳 bin 数量。将 [‘auto’, ‘fd’, ‘scott’, ‘rice’, ‘sturges’] 中的一个作为 ‘bins’ 参数传递,将使用相应的估算器。已添加一个使用 Airspeed Velocity 的基准测试套件,替换了之前的 vbench-based 套件。您可以通过
python runtests.py --bench在本地运行该套件。有关更多详细信息,请参阅benchmarks/README.rst。新增函数
np.shares_memory,可以精确检查两个数组是否具有内存重叠。np.may_share_memory现在也提供一个选项,用于花费更多精力来减少假阳性。SkipTest和KnownFailureException异常类已暴露在numpy.testing命名空间中。在测试函数中引发它们,分别将测试标记为跳过或已知失败。f2py.compile有一个新的extension关键字参数,允许为生成的临时文件指定 fortran 扩展。例如,可以将文件指定为*.f90。以前被忽略的verbose参数也已激活。已向
np.random.randint添加了dtype参数。现在可以生成以下类型的随机 ndarrays:np.bool_,np.int8,np.uint8,np.int16,np.uint16,np.int32,np.uint32,np.int64,np.uint64,np.int_,np.intp
精度是按精度指定的,而不是按 C 类型指定的。因此,在某些平台上,
np.int64可能是一个long而不是long long,即使指定的 dtype 是long long,因为两者可能具有相同的精度。结果类型取决于 Numpy 为给定精度使用的 C 类型。字节序规范也被忽略,生成的数组始终是本机字节序。新的
np.moveaxis函数允许通过显式提供源轴和目标轴来将一个或多个数组轴移动到新位置。此函数应比当前的rollaxis函数更易于使用,并提供更多功能。各种
numpy.polynomialfit 的deg参数已扩展,可以接受要包含在 fit 中的项的度数列表,所有其他项的系数将被约束为零。此更改向后兼容,传递标量deg的行为将与以前相同。在 npy_math 库中添加了一个基于 Python 版本的浮点数 divmod 函数。
改进#
np.gradient 现在支持 axis 参数#
为保持一致性,向 np.gradient 添加了 axis 参数。它允许指定计算梯度的轴。
np.lexsort 现在支持 object 数据类型的数组#
当类型未实现 argsort 方法的 merge-sort 类型时,该函数现在内部调用通用 npy_amergesort。
np.ma.core.MaskedArray 现在支持 order 参数#
在构造新的 MaskedArray 实例时,可以像调用 np.ndarray 时一样,使用 order 参数对其进行配置。添加此参数允许正确处理 np.ma.core.array 和 np.ma.core.asarray 等几个 MaskedArray 相关实用函数中的 order 参数。
掩码数组的内存和速度改进#
使用 mask=True(或 mask=False)创建掩码数组现在使用 np.ones(或 np.zeros)创建掩码,这更快并且避免了大的内存峰值。还进行了另一项优化,以避免在打印掩码数组时出现内存峰值和无用计算。
ndarray.tofile 在 Linux 上现在使用 fallocate#
该函数现在使用 fallocate 系统调用为支持该功能的文件系统预留足够的磁盘空间。
形式为 A.T @ A 和 A @ A.T 的操作优化#
以前,所有矩阵乘法都使用 gemm BLAS 操作。现在,如果矩阵乘法是在矩阵与其转置之间进行的,它将使用 syrk BLAS 操作以提高性能。此优化已扩展到 @、numpy.dot、numpy.inner 和 numpy.matmul。
注意:要求转置和非转置矩阵共享数据。
np.testing.assert_warns 现在可以用作上下文管理器#
这模仿了 assert_raises 的行为。
np.random.shuffle 的速度改进#
对于一维 ndarrays,np.random.shuffle 现在快得多。
更改#
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 等其他函数。如果两个参数无法转换为公共类型,则可能引发 TypeError 或 ValueError,具体取决于它们的顺序。现在,np.dot 将始终引发 TypeError。
linalg.norm 返回类型更改#
linalg.norm 函数现在执行所有计算的浮点数计算并返回浮点数结果。此更改修复了由于整数溢出和 abs 对最小值的有符号整数(例如 int8(-128))失败而导致的 bug。为了保持一致性,即使在整数有效的情况下也使用浮点数。
弃用#
Fortran 顺序的数组视图#
F_CONTIGUOUS 标志曾用于指示使用更改元素大小的 dtype 的视图将更改第一个索引。对于同时是 F_CONTIGUOUS 和 C_CONTIGUOUS 的数组,这总是存在问题,因为 C_CONTIGUOUS 具有优先权。放宽的步幅检查导致更多此类双连续数组,并因此破坏了一些现有代码。请注意,这也影响通过为数组的 dtype 属性赋值来更改 dtype。此弃用的目的是将来将视图限制为 C_CONTIGUOUS 数组。一种向后兼容的解决方法是改用 a.T.view(...).T。也可能向 view 方法添加一个参数以显式请求 Fortran 顺序视图,但这将不向后兼容。
数组排序的无效参数#
目前,可以在 array.flatten 或 array.ravel 等方法的 order 参数中传递非以下值之一的参数:“C”、“F”、“A”、“K”(请注意,所有这些可能的值都是 Unicode 且不区分大小写)。未来的版本将不允许这种行为。
testing 命名空间中的随机数生成器#
Python 标准库的随机数生成器以前在 testing 命名空间中暴露为 testing.rand。不推荐使用此生成器,它将在未来的版本中移除。请改用 numpy.random 命名空间中的生成器。
闭区间上的随机整数生成#
为了符合 Python C API(它优先考虑半开区间而非闭区间),np.random.random_integers 被弃用,转而推荐调用 np.random.randint。如“新功能”中所述,np.random.randint 已通过 dtype 参数得到增强。但是,np.random.random_integers 不会很快被移除。
FutureWarnings#
向 MaskedArray 的切片/视图赋值#
目前,掩码数组的切片包含原始数据的视图和掩码的写时复制视图。因此,对切片掩码的任何更改都将导致原始掩码的副本被创建,并且该新掩码被更改,而不是原始掩码。例如,如果我们像这样创建原始数据的切片 view = original[:],那么一个数组中对数据的修改将影响另一个数组的数据,但由于掩码在赋值操作期间会被复制,因此对掩码的更改将保留在本地。当使用 MaskedArray(data, mask) 显式构造掩码数组时,也会发生类似的情况,返回的数组将包含 data 的视图,但掩码将是 mask 的写时复制视图。
将来,这些情况将被规范化,以便数据和掩码数组得到相同的处理,并且对任一数组的修改都将在视图之间传播。在 1.11 版本中,当用户代码修改了视图的掩码,而该修改在未来可能会传播回原始数据时,numpy 将发出 MaskedArrayFutureWarning 警告。为了消除这些警告并使您的代码在未来更改中保持稳健,您有两种选择:如果您想保留当前行为,请在修改掩码之前调用 masked_view.unshare_mask()。如果您想提前获得未来的行为,请使用 masked_view._sharedmask = False。但是,请注意,设置 _sharedmask 属性将破坏后续对 masked_view.unshare_mask() 的显式调用。