NumPy 1.11.0 发布说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.5,并包含多项增强和改进。另请注意下面列出的构建系统变更,它们可能会产生微妙的影响。
由于工具链损坏,此版本不提供 Windows™ 二进制文件。Windows™ 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
中的随机数生成器。当使用不同大小的 dtype 导致最后一维改变时,
ndarray.view
方法将只允许 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)不符。对于大多数用例,时区无关的 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')
作为此变更的推论,我们不再禁止日期单位的 datetimes 和时间单位的 datetimes 之间的类型转换。对于时区无关的 datetimes,从日期转换为时间的规则不再模糊。
linalg.norm
返回类型变更#
linalg.norm
函数的返回类型现在一律为浮点数。之前某些范数类型返回整数。
多项式拟合变更#
numpy polynomial 包中的各种拟合函数不再接受非整数作为度数(degree)规范。
np.dot 现在引发 TypeError
而非 ValueError
#
此行为模仿了其他函数(例如 np.inner
)的行为。如果两个参数无法转换为通用类型,则根据其顺序,它可能会引发 TypeError
或 ValueError
。现在,np.dot
将始终引发 TypeError
。
关于行为变更的 FutureWarning#
在
np.lib.split
中,无论被分割数组的维度如何,结果中的空数组总是具有维度(0,)
。现在已更改,以便保留维度。此变更的FutureWarning
自 Numpy 1.9 起已存在,但由于一个 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
插槽替换以保留结构体布局)。这些成员从未被使用过,因此第三方代码也不太可能使用它们,但我们在此提及以求完整。
旧式类的对象 dtype 检测#
在 Python 2 中,旧式用户定义类的实例对象在 dtype 检测处理程序中不再自动算作“object”类型。相反,与 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
现在也提供一个选项,可以付出更多努力来减少误报。SkipTest
和KnownFailureException
异常类已在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 库添加一个仿照 Python 版本的浮点类型 divmod 函数。
改进#
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
现在快得多。
变更#
Pyrex 支持已从 numpy.distutils
中移除#
方法 build_src.generate_a_pyrex_source
仍将可用;用户已对其进行猴子补丁以支持 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 属性来改变 dtype 的操作。此次弃用的目的是在未来某个时候将视图限制为 C_CONTIGUOUS 数组。一个向后兼容的解决方案是使用 a.T.view(...).T
。此外,可能会向视图方法添加一个参数,以明确请求 Fortran 顺序视图,但这将不向后兼容。
数组排序的无效参数#
目前,在 array.flatten
或 array.ravel
等方法中,order
参数可以传入非以下值:‘C’、‘F’、‘A’、‘K’(请注意,所有这些可能的值都是 Unicode 且不区分大小写)。未来版本将不再允许此类行为。
testing
命名空间中的随机数生成器#
Python 标准库的随机数生成器之前以 testing.rand
的形式暴露在 testing
命名空间中。不建议使用此生成器,它将在未来版本中移除。请改用 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()
的显式调用。