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
以及指定约简轴中。
在未来的版本中,将进行以下更改。
将删除
numpy.testing
中公开的rand
函数。该函数是从早期 Numpy 中遗留下来的,并且是使用 Python random 模块实现的。应改用numpy.random
中的随机数生成器。ndarray.view
方法将只允许使用不同大小的 dtype 来查看 c_contiguous 数组,从而导致最后一维发生变化。这与当前的行为不同,在当前的行为中,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)相冲突。对于大多数用例,首选时区朴素的日期时间类型,类似于 Python 标准库中的datetime.datetime
类型。因此,datetime64 不再假设输入为本地时间,也不再打印本地时间。
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00')
为了向后兼容,datetime64 仍然解析时区偏移量,它通过转换为 UTC 来处理这些偏移量。但是,生成的日期时间是时区朴素的。
>>> 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')
作为此更改的推论,我们不再禁止在具有日期单位的日期时间和具有时间单位的日期时间之间进行转换。使用时区朴素的日期时间,从日期到时间的转换规则不再模棱两可。
linalg.norm
返回类型更改#
linalg.norm
函数的返回类型现在始终是浮点数。某些范数类型以前返回整数。
多项式拟合更改#
numpy 多项式包中的各种拟合函数不再接受非整数作为度数规范。
np.dot 现在引发TypeError
而不是ValueError
#
此行为模仿其他函数(如np.inner
)的行为。如果无法将两个参数转换为公共类型,则可能会引发TypeError
或ValueError
,具体取决于它们的顺序。现在,np.dot
将始终引发TypeError
。
更改行为的 FutureWarning#
在
np.lib.split
中,结果中的空数组始终具有(0,)
维,无论被分割的数组的维数如何。这已更改,以便保留维数。自 Numpy 1.9 以来,此更改的FutureWarning
已到位,但是,由于错误,有时不会发出警告,并且维数已被保留。
%
和//
运算符#
这些运算符分别使用remainder
和floor_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_return
和inner_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
现在也有一个选项可以花费更多精力来减少误报。在
numpy.testing
命名空间中公开了SkipTest
和KnownFailureException
异常类。在测试函数中引发它们分别表示跳过测试或将其标记为已知故障。f2py.compile
有一个新的extension
关键字参数,允许为生成的临时文件指定 Fortran 扩展名。例如,可以将文件指定为*.f90
。verbose
参数也被激活,之前它被忽略了。一个
dtype
参数已添加到np.random.randint
中。现在可以生成以下类型的随机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
将像以前一样工作。一个模拟 Python 版本的浮点类型 divmod 函数已添加到 npy_math 库中。
改进#
np.gradient
现在支持 axis
参数#
为保持一致性,向 np.gradient
添加了 axis
参数。它允许指定计算梯度的轴。
np.lexsort
现在支持具有对象数据类型的数组#
当类型未实现 merge-sort 类型的 argsort
方法时,该函数现在会在内部调用泛型 npy_amergesort
。
np.ma.core.MaskedArray
现在支持 order
参数#
构造新的 MaskedArray
实例时,可以使用类似于调用 np.ndarray
时的 order
参数进行配置。添加此参数允许在几个与 MaskedArray 相关的实用函数(例如 np.ma.core.array
和 np.ma.core.asarray
)中正确处理 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 的速度改进#
对于一维 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
)的行为。如果无法将两个参数转换为公共类型,则可能会引发TypeError
或ValueError
,具体取决于它们的顺序。现在,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顺序视图,但这将与向后不兼容。
数组排序的无效参数#
目前可以在诸如array.flatten
或array.ravel
之类的methods中为order
参数传入以下参数之外的参数:'C'、'F'、'A'、'K'(注意所有这些可能的值既是unicode又是大小写不敏感的)。这种行为在未来的版本中将不被允许。
testing
命名空间中的随机数生成器#
以前在testing
命名空间中将Python标准库随机数生成器作为testing.rand
公开。不建议使用此生成器,它将在未来的版本中删除。请改用numpy.random
命名空间中的生成器。
闭区间上的随机整数生成#
根据Python C API,它更倾向于半开区间而不是闭区间,np.random.random_integers
正在被弃用,取而代之的是调用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()
的后续显式调用。