NumPy 1.11.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.5,并包含许多增强和改进.另请注意下面列出的构建系统更改,因为它们可能会有微妙的影响.
由于工具链损坏,此版本未提供 Windows (TM) 二进制文件.Windows (TM) Python 包的提供商之一是您的最佳选择.
亮点#
这些改进的详细信息可以在下面找到.
datetime64 类型现在是时区天真的.
已为
randint
添加了 dtype 参数.改进了对可能共享内存的两个数组的检测.
自动估计
np.histogram
的箱子大小.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 轴时.
在未来的版本中,将进行以下更改.
在
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).对于大多数用例,首选时区天真的日期时间类型,类似于 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
槽位替代以保持结构体布局).这些成员从未用于任何用途,因此第三方代码也不太可能使用它们,但我们在此提及以确保完整性.
旧式类的对象类型检测#
在 Python 2 中,旧式用户定义类的实例不再自动被 dtype 检测处理程序视为 ‘object’ 类型.相反,如同在 Python 3 中一样,它们可能被视为序列,但前提是它们必须定义 __len__ 和 __getitem__ 方法.这修复了一个段错误以及 Python 2 和 3 之间的不一致性.
新功能#
np.histogram
现在提供了插件估计器,用于自动估计最佳的箱数.将 [‘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`` 参数也被激活,之前它被忽略了.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
参数#
axis
参数被添加到 np.gradient
中以保持一致性.它允许指定沿哪些轴计算梯度.
np.lexsort
现在支持对象数据类型的数组#
现在,当类型没有实现某种合并排序的 argsort
方法时,该函数内部调用通用的 npy_amergesort
.
np.ma.core.MaskedArray
现在支持 order
参数#
在构造一个新的 MaskedArray
实例时,可以使用一个类似于调用 np.ndarray
时的 order
参数进行配置.这个参数的添加允许在几个与 MaskedArray 相关的实用函数中正确处理 order
参数,例如 np.ma.core.array
和 np.ma.core.asarray
.
掩码数组的内存和速度改进#
使用 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 的速度改进#
np.random.shuffle
现在对于一维 ndarrays 来说快了很多.
变化#
Pyrex 支持已从 numpy.distutils
中移除#
方法 build_src.generate_a_pyrex_source
将保持可用;它已被用户通过monkeypatch支持Cython而不是Pyrex.不过,建议切换到更好的支持构建Cython扩展的方法.
np.broadcast
现在可以只用一个参数调用#
在这种情况下,生成的对象将简单地模仿对单个数组的迭代.这一变化使诸如
- 如果 len(x) == 1:
shape = x[0].shape
- 否则:
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
等方法中为 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
的切片/视图#
当前,掩码数组的一个切片包含原始数据的视图和写时复制的掩码视图.因此,对切片掩码的任何更改都将导致原始掩码的副本被创建,并且该新掩码将被更改,而不是原始掩码.例如,如果我们像这样对原始数组进行切片,``view = original[:]``,那么对一个数组中的数据的修改将影响另一个数组的数据,但由于掩码将在赋值操作期间被复制,对掩码的更改将保持本地化.当使用 MaskedArray(data, mask)
显式构造掩码数组时,会出现类似的情况,返回的数组将包含 data
的视图,但掩码将是 mask
的写时复制视图.
在未来,这些情况将被规范化,以便数据和掩码数组以相同的方式处理,并且对任一数组的修改将在视图之间传播.在1.11中,每当用户代码修改掩码视图时,numpy将发出 MaskedArrayFutureWarning
警告,这在未来可能会导致值传播回原始数组.要消除这些警告并使您的代码对即将到来的更改具有鲁棒性,您有两个选项:如果您想保持当前的行为,请在修改掩码之前调用 masked_view.unshare_mask()
.如果您想提前获得未来的行为,请使用 masked_view._sharedmask = False
.但是,请注意,设置 _sharedmask
属性将破坏后续对 masked_view.unshare_mask()
的显式调用.