NumPy-1-26-中文文档-二十七-
NumPy 1.26 中文文档(二十七)
NumPy 1.18.4 Release Notes
这是 1.18.x 系列中最后一个计划发布的版本。它恢复了在 1.18.3 中引入的 bool("0")
行为,并修复了 Generator.integers
的一个 bug。当 numpy 导入失败时,错误消息中还包含到文档中新故障排除部分的链接。
本次发布支持的 Python 版本为 3.5-3.8。下游开发人员应使用 Cython >= 0.29.15 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现错误。
贡献者
本次发布共有 4 个人参与了贡献。名字后带有“+”符号的人第一次为该版本提交了贡献。
-
Charles Harris
-
Matti Picus
-
Sebastian Berg
-
Warren Weckesser
已合并的拉取请求
本次发布合并了 6 个拉取请求。
-
#16055: BLD:添加 i686 支持到 1.18 构建
-
#16090: BUG:random:
Generator.integers(2**32)
总是返回 0。 -
#16091: BLD:修复 macOS 上 libgfortran 的路径问题
-
#16109: REV:回滚了对类型转换的副作用更改
-
#16114: BLD:在 Windows 上将 openblas 库放在本地目录中
-
#16132: DOC:将导入错误“howto”更改为链接到新的故障排除...
贡献者
本次发布共有 4 个人参与了贡献。名字后带有“+”符号的人第一次为该版本提交了贡献。
-
Charles Harris
-
Matti Picus
-
Sebastian Berg
-
Warren Weckesser
已合并的拉取请求
本次发布共合并了 6 个拉取请求。
-
#16055: BLD:添加 i686 支持到 1.18 构建
-
#16090: BUG:random:
Generator.integers(2**32)
总是返回 0。 -
#16091: BLD:修复 macOS 上 libgfortran 的路径问题
-
#16109: REV:回滚了对类型转换的副作用更改
-
#16114: BLD:在 Windows 上将 openblas 库放在本地目录中
-
#16132: DOC:将导入错误“howto”更改为链接到新的故障排除...
NumPy 1.18.3 版本说明
此版本包含了各种错误/退化性修复。
此版本支持的 Python 版本为 3.5-3.8。下游开发人员应使用 Cython >= 0.29.15 以支持 Python 3.8,并使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上出错。
亮点
- 修复了
numpy.random.multivariate_normal
中 method=’eigh’ 和 method=’cholesky’ 方法。这些方法产生了错误分布的样本。
贡献者
此版本共有 6 人为其做出贡献。名字后面带有“+”的人第一次为其贡献了补丁。
-
Charles Harris
-
Max Balandat +
-
@Mibu287 +
-
Pan Jan +
-
Sebastian Berg
-
@panpiort8 +
合并的拉取请求
此版本共合并了 5 个拉取请求。
-
#15916:BUG:修复 numpy.random.multivariate_normal 的 eigh 和 cholesky 方法
-
#15929:BUG, MAINT:移除字符串到数字的不正确特例…
-
#15930:BUG:确保内存错误发生后数组处于有效状态…
-
#15954:BUG:检查 _generator.multinomial 中的 pvals 是否为 1D。
-
#16017:BUG:generator.dirichlet 中的 Alpha 参数必须是 1D
亮点
- 修复了
numpy.random.multivariate_normal
中 method=’eigh’ 和 method=’cholesky’ 方法。这些方法产生了错误分布的样本。
贡献者
此版本共有 6 人为其做出贡献。名字后面带有“+”的人第一次为其贡献了补丁。
-
Charles Harris
-
Max Balandat +
-
@Mibu287 +
-
Pan Jan +
-
Sebastian Berg
-
@panpiort8 +
合并的拉取请求
此版本共合并了 5 个拉取请求。
-
#15916:BUG:修复 numpy.random.multivariate_normal 的 eigh 和 cholesky 方法
-
#15929:BUG, MAINT:移除字符串到数字的不正确特例…
-
#15930:BUG:确保内存错误发生后数组处于有效状态…
-
#15954:BUG:检查 _generator.multinomial 中的 pvals 是否为 1D。
-
#16017:BUG:generator.dirichlet 中的 Alpha 参数必须是 1D
NumPy 1.18.2 发行说明
这个小版本包含了 numpy/random 中性能回退的修复以及一些 bug/维护更新。
此版本支持的 Python 版本为 3.5-3.8。下游开发人员应使用 Cython >= 0.29.15 来支持 Python 3.8,以及 OpenBLAS >= 3.7 以避免在 Skylake 架构上发生错误。
贡献者
共有 5 人对此版本进行了贡献。名字前带有“+”号的人第一次贡献了补丁。
-
Charles Harris
-
Ganesh Kathiresan +
-
Matti Picus
-
Sebastian Berg
-
przemb +
合并的拉取请求
共有 7 个拉取请求合并到此版本。
-
#15675: TST:将 _no_tracing 移至 testing._private
-
#15676: MAINT:某些随机函数中存在较大开销
-
#15677: TST:不在 Azure Mac 测试中创建 gfortran 链接。
-
#15679: BUG:在
ndarray.__contains__
中添加了遗漏的错误检查 -
#15722: MAINT:使用基于列表的 API 调用子进程
-
#15729: REL:为 1.18.2 版本做准备。
-
#15734: BUG:修复 32 位系统上 nm 失败的逻辑错误
贡献者
共有 5 人对此版本进行了贡献。名字前带有“+”号的人第一次贡献了补丁。
-
Charles Harris
-
Ganesh Kathiresan +
-
Matti Picus
-
Sebastian Berg
-
przemb +
合并的拉取请求
共有 7 个拉取请求合并到此版本。
-
#15675: TST:将 _no_tracing 移至 testing._private
-
#15676: MAINT:某些随机函数中存在较大开销
-
#15677: TST:不在 Azure Mac 测试中创建 gfortran 链接。
-
#15679: BUG:在
ndarray.__contains__
中添加了遗漏的错误检查 -
#15722: MAINT:使用基于列表的 API 调用子进程
-
#15729: REL:为 1.18.2 版本做准备。
-
#15734: BUG:修复 32 位系统上 nm 失败的逻辑错误
NumPy 1.18.1 发布说明
此版本修复了针对 NumPy 1.18.0 报告的错误。特别是造成广泛问题的两个缺陷是:
-
Cython 随机扩展测试没有使用临时目录进行构建,导致权限违规。 现已修复。
-
Numpy distutils 在所有 C 编译器运行中添加了 -std=c99,导致了行为改变和下游编译问题。 该标志现在仅在构建 numpy C 代码时应用。
本版本支持的 Python 版本是 3.5-3.8。 下游开发者应使用 Cython >= 0.29.14 来支持 Python 3.8,并使用 OpenBLAS >= 3.7 来避免在 Skylake 架构上发生错误。
贡献者
共有 7 人对本次发布作出了贡献。 姓名后带有“+”表示他们首次为补丁作出贡献。
-
Charles Harris
-
Matti Picus
-
Maxwell Aladago
-
Pauli Virtanen
-
Ralf Gommers
-
Tyler Reddy
-
Warren Weckesser
已处理的拉取请求
共有 13 个拉取请求合并到本次发布。
-
#15158:MAINT:为 towncrier 更新 pavement.py。
-
#15159:DOC: 添加移动模块到 1.18 发布说明
-
#15161:MAINT:1.18.x 的轻微回退和更新
-
#15176:TST:添加大整数数组的 assert_array_equal 测试
-
#15184:BUG: 使用临时目录并检查 cython 测试的版本 (#15170)
-
#15220:BUG: distutils: 修复 msvc+gfortran openblas 处理角落情况。
-
#15221:BUG: 移除 -std=c99 用于 c++ 编译 (#15194)
-
#15222:MAINT:在 win32 上取消跳过测试
-
#15223:TST:在 Travis 和 Azure 上添加 BLAS ILP64 运行
-
#15245:MAINT:仅在需要时添加 –std=c99
-
#15246:BUG: 函数梯度处理整数数组问题。
-
#15247:MAINT: 在测试中不要使用私有 Python 函数。
-
#15250:REL:准备 NumPy 1.18.1 发布。
贡献者
共有 7 人对本次发布作出了贡献。 姓名后带有“+”表示他们首次为补丁作出贡献。
-
Charles Harris
-
Matti Picus
-
Maxwell Aladago
-
Pauli Virtanen
-
Ralf Gommers
-
Tyler Reddy
-
Warren Weckesser
已处理的拉取请求
共有 13 个拉取请求合并到本次发布。
-
#15158:MAINT:为 towncrier 更新 pavement.py。
-
#15159:DOC: 添加移动模块到 1.18 发布说明
-
#15161: MAINT, DOC: 1.18.x 的小修复和更新
-
#15176: TST: 为大整数数组添加 assert_array_equal 测试
-
#15184: BUG: 在 cython 测试中使用临时目录并检查版本(#15170)
-
#15220: BUG: distutils: 修复 msvc+gfortran openblas 处理的边缘情况
-
#15221: BUG: 移除 C++ 编译的 -std=c99(#15194)
-
#15222: MAINT: 在 win32 上取消跳过的测试
-
#15223: TST: 在 Travis 和 Azure 中添加 BLAS ILP64 运行
-
#15245: MAINT: 仅在需要时添加 –std=c99
-
#15246: BUG: lib: 修复梯度对整数数组的处理
-
#15247: MAINT: 在测试中不要使用私有的 Python 函数
-
#15250: REL: 准备 NumPy 1.18.1 版本的发布
NumPy 1.18.0 发行说明
除了常规的错误修复外,此 NumPy 发行版还清理和文档化了新的随机 C-API,废弃了大量旧的弃用内容,并改进了文档的外观。支持的 Python 版本为 3.5-3.8。这是最后一个支持 Python 3.5 的 NumPy 发行系列。
下游开发人员应使用 Cython >= 0.29.14 以支持 Python 3.8,并使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现问题。
亮点
-
numpy.random
的 C-API 已定义和文档化。 -
与 64 位 BLAS 和 LAPACK 库链接的基础设施。
-
许多文档改进。
新的功能
添加了多元超几何分布到numpy.random
将方法multivariate_hypergeometric
添加到类numpy.random.Generator
中。此方法生成多元超几何概率分布的随机变量。(gh-13794)
弃用
np.fromfile
和np.fromstring
将在错误数据上报错
在未来的 numpy 发行版中,当解析错误数据时,函数np.fromfile
和np.fromstring
将抛出错误。这样做会产生DeprecationWarning
,而以前会静默返回部分甚至无效的数据。此弃用还影响了 C 定义的函数PyArray_FromString
和PyArray_FromFile
(gh-13605)
弃用非标量数组作为ma.fill_value
的填充值
将非标量数组设置为MaskedArray.fill_value
已弃用,因为广播填充值到数组的逻辑很脆弱,特别是在切片时。(gh-13698)
弃用PyArray_As1D
,PyArray_As2D
弃用PyArray_As1D
,PyArray_As2D
,使用PyArray_AsCArray
替代 (gh-14036)
弃用np.alen
np.alen
已被弃用。请使用len
替代。(gh-14181)
弃用财务函数
根据 NEP-32 的规定,财务函数fv
ipmt
, irr
, mirr
, nper
, npv
, pmt
, ppmt
, pv
和rate
已被弃用,并将在 NumPy 1.20 中移除。这些函数的替代品是 Python 包 numpy-financial 。(gh-14720)
numpy.ma.mask_cols
和numpy.ma.mask_row
的axis
参数已弃用
此参数一直被忽略。(gh-14996)
过期弃用
-
PyArray_As1D
和PyArray_As2D
已被移除,使用PyArray_AsCArray
替代 (gh-14036) -
np.rank
已被移除。这在 NumPy 1.10 中已被弃用,并已被np.ndim
替代。(gh-14039) -
expand_dims
在 1.13.0 版本中废弃的超出范围轴已经过期。(gh-14051) -
移除
PyArray_FromDimsAndDataAndDescr
和PyArray_FromDims
(它们将始终引发错误)。使用PyArray_NewFromDescr
和PyArray_SimpleNew
代替。(gh-14100) -
numeric.loads
,numeric.load
,np.ma.dump
,np.ma.dumps
,np.ma.load
,np.ma.loads
已被移除,使用pickle
方法代替。(gh-14256) -
移除
arrayprint.FloatFormat
,arrayprint.LongFloatFormat
,使用FloatingFormat
代替 -
移除
arrayprint.ComplexFormat
,arrayprint.LongComplexFormat
,使用ComplexFloatingFormat
代替 -
移除
arrayprint.StructureFormat
,使用StructureVoidFormat
代替。(gh-14259) -
np.testing.rand
已被移除。这在 NumPy 1.11 中已被弃用,并已被np.random.rand
替代。(gh-14325) -
在
numpy/lib/utils.py
中移除SafeEval
类。这在 NumPy 1.10 已被弃用。使用np.safe_eval
代替。(gh-14335) -
移除对
np.select
中 boolean 和空条件列表的弃用支持。(gh-14583) -
数组顺序只接受'C','F','A'和'K'。更宽容的选项在 NumPy 1.11 中已弃用。(gh-14596)
-
np.linspace 参数
num
必须是整数。在 NumPy 1.12 中已弃用。(gh-14620) -
具有多个输出的 UFunc 必须使用元组作为
out
kwarg。这完成了自 NumPy 1.10 起弃用的操作。(gh-14682)
文件numpy/testing/decorators.py
,numpy/testing/noseclasses.py
和numpy/testing/nosetester.py
已被移除。它们从未被视为公共内容(所有相关对象存在于numpy.testing
名称空间中),并且自 NumPy 1.15.0 以来导入它们即已弃用(gh-14567)
兼容性说明
numpy.lib.recfunctions.drop_fields
不再能返回 None
如果使用drop_fields
来删除所有字段,则以前的数组将被完全丢弃并返回 None。现在它返回与输入相同形状的数组,但没有字段。旧的行为可以保留为:
dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
dropped_arr = None
将空的 recarray 转换为 None。(gh-14510)
numpy.argmin/argmax/min/max
如果在数组中存在则返回NaT
如果数组中存在 NaT
,numpy.argmin
、numpy.argmax
、numpy.min
和 numpy.max
将返回 NaT
。 (gh-14717)
np.can_cast(np.uint64, np.timedelta64, casting='safe')
现在为 False
以前这是 True
- 但是,这与 uint64
不能安全地转换为 int64
不一致,导致类型解析出现问题。
如果这影响到您的代码,请先将 uint64
转换为 int64
。 (gh-14718)
从 numpy.random.Generator.integers
改变了随机变量流
numpy.random.Generator.integers
存在错误,导致 8 位和 16 位整数类型的抽样有偏误。修复该错误将改变输出流,与以前版本的输出流不同。 (gh-14777)
为 datetime64
、timedelta64
添加更多的 ufunc 循环
np.datetime('NaT')
应该更像 float('Nan')
。添加所需的基础设施,以便在 datetime64
和 timedelta64
dtypes 上运行 np.isinf(a)
和 np.isnan(a)
。还为 numpy.fmin
和 numpy.fmax
添加了特定的循环,该循环蒙版了 NaT
。这可能需要调整用户代码。特别是,不允许调用 numpy.isinf
或 numpy.isnan
或检查它们是否引发异常的代码将需要调整,而错误调用 numpy.fmax
和 numpy.fmin
而不是分别调整 numpy.maximum
或 numpy.minimum
的代码也需要调整。这也影响 numpy.nanmax
和 numpy.nanmin
。 (gh-14841)
在 numpy.random
中移动模块
作为 API 清理的一部分,numpy.random
中的子模块 bit_generator
、philox
、pcg64
、sfc64,
common、
generator和
bounded_integers分别移动到
_bit_generator、
_philox、
_pcg64、
_sfc64, _common
、_generator
和 _bounded_integers
,以指示它们不是公共接口的一部分。 (gh-14608)
C API 变更
对于结构化数据类型,PyDataType_ISUNSIZED(descr)
现在返回 False
以前对于项目大小为 0 的任何数据类型都会返回 True,但现在对于项目大小为 0 的非灵活数据类型 np.dtype([])
,现在会返回 false。 (gh-14393)
新特性
添加自己的 *.pxd
Cython 导入文件
添加了一个 numpy/__init__.pxd
文件。它将用于 cimport numpy
(gh-12284)
可以将轴的元组输入到 expand_dims
numpy.expand_dims
的 axis
关键字现在可以接受轴的元组。以前,axis
必须是整数。 (gh-14051)
对 64 位 OpenBLAS 的支持
添加对 64 位(ILP64)OpenBLAS 的支持。有关详细信息,请参见 site.cfg.example
。 (gh-15012)
向 F2PY 添加了 --f2cmap
选项
允许指定从文件加载 Fortran 到 C 类型映射定制的文件。 (gh-15113)
改进
不同大小的 C 数字类型具有唯一的名称
在任何给定平台上,np.intc
、np.int_
和np.longlong
中的两个先前的无法通过其repr
区分,尽管它们相应的dtype
具有不同的属性。对这些类型的无符号反向部分,以及在某些平台上np.double
和np.longdouble
都存在类似问题
这些类型现在总是打印带有唯一__name__
。 (gh-10151)
argwhere
现在对 0 维数组产生一致的结果
在 N 维数组上,numpy.argwhere
现在总是产生一个形状为(n_non_zero, arr.ndim)
的数组,即使arr.ndim == 0
。在这种情况下,先前的最后一个轴将具有维度为 1。 (gh-13610)
为random.permutation
和random.shuffle
添加axis
参数
先前的random.permutation
和random.shuffle
函数只能沿着第一个轴对数组进行洗牌;现在它们有一个新的参数axis
,允许沿指定轴进行洗牌。 (gh-13829)
np.random.multivariate_normal
的method
关键字参数
现在为np.random.multivariate_normal
添加了一个method
关键字参数,可能的取值为{'svd', 'eigh', 'cholesky'}
。要使用它,写成np.random.multivariate_normal(..., method=<method>)
。 (gh-14197)
为numpy.fromstring
添加复数支持
现在 numpy.fromstring
可以读取复数。 (gh-14227)
当axis
不为 None 时,numpy.unique
在不同的轴上具有一致的顺序
在numpy.unique
中使用moveaxis
而不是swapaxes
,以保持除参数中的轴之外的轴的顺序不变。 (gh-14255)
numpy.matmul
的布尔输出现在转换为布尔值
调用numpy.matmul
,其中输出是布尔数组,将填充数组与结果的 uint8 等效项,而不是 0/1。现在它会强制输出为 0 或 1(NPY_TRUE
或NPY_FALSE
)。 (gh-14464)
当范围为2**32
时,numpy.random.randint
产生了不正确的值
在 1.17.0 中引入的实现在确定是否使用 32 位路径或完整 64 位路径时存在错误检查,错误地将具有高低范围为2**32
的随机整数生成重定向到 64 位生成器。 (gh-14501)
为numpy.fromfile
添加复数支持
现在 numpy.fromfile
可以读取复数。 (gh-14730)
如果编译器命名为 gcc
,则添加std=c99
GCC 在 5 版本之前需要-std=c99
命令行参数。更新的编译器会自动打开 C99 模式。如果编译器名称中含有gcc
,则编译器设置代码将自动添加该代码。(gh-14771)
改变
NaT
现在按顺序排列到数组的末尾
对于排序目的,NaT
现在有效地被视为最大的整数,因此其排序到数组的末尾。这种变化是为了保持与NaN
排序行为的一致性。(gh-12658) (gh-15068)
np.set_printoptions
中的错误threshold
引发TypeError
或ValueError
以前的不正确的threshold
会引发ValueError
;现在对于非数字类型引发TypeError
,对于nan
值引发ValueError
。(gh-13899)
在保存带有元数据的 dtype 时发出警告
当使用numpy.save
保存带有metadata
的数组时,将发出UserWarning
。保存这样的数组可能不会保留元数据,如果保留了元数据,则加载它将导致ValueError
。这种保存和加载的缺陷将在将来的发布中解决。(gh-14142)
numpy.distutils
的附加行为已更改为 LDFLAGS 和类似行为
numpy.distutils
一直覆盖而不是附加到LDFLAGS
和其他类似的环境变量上,用于编译 Fortran 扩展。现在默认行为已更改为附加-这是大多数情况下预期的行为。为了保留旧的(覆盖)行为,将NPY_DISTUTILS_APPEND_FLAGS
环境变量设置为 0。适用于:LDFLAGS
,F77FLAGS
,F90FLAGS
,FREEFLAGS
,FOPT
,FDEBUG
和FFLAGS
。在这种行为更改会影响到使用的编译标志的情况下,NumPy 1.16 和 1.17 会发出编译警告。(gh-14248)
移除numpy.random.entropy
而不使用弃用
numpy.random.entropy
添加到了numpy.random
命名空间中 1.17.0。它原本是一个私有的 c 扩展模块,但被公开了。它已经被numpy.random.SeedSequence
取代,因此该模块已完全移除。(gh-14498)
增加选项以静默构建配置并使用-Werror
进行构建
添加了两个新的配置选项。在build_src
子命令期间,作为配置 NumPy 的一部分,通过探测对各种运行时函数和例程的支持来创建文件_numpyconfig.h
和config.h
。以前,在这个阶段,非常冗长的编译器输出会掩盖更重要的信息。默认情况下输出被静音。运行runtests.py --debug-info
将在build_src
子命令中添加--verbose-cfg
,这将恢复以前的行为。
在配置期间将CFLAGS=-Werror
添加以将警告转换为错误会触发错误。现在runtests.py --warn-error
将在build
子命令中添加--warn-error
,这将传播到build_ext
和build_lib
子命令。这将在这些阶段添加编译器标志,并在构建 NumPy 本身时将编译器警告转换为错误,避免build_src
子命令的编译器调用。
亮点
-
已定义和记录了
numpy.random
的 C-API。 -
与 64 位 BLAS 和 LAPACK 库进行链接的基本基础设施。
-
许多文档改进。
新函数
添加了多元超几何分布到numpy.random
已向类numpy.random.Generator
添加了方法multivariate_hypergeometric
。该方法从多元超几何概率分布中生成随机变量。(gh-13794)
添加了多元超几何分布到numpy.random
已向类numpy.random.Generator
添加了方法multivariate_hypergeometric
。该方法从多元超几何概率分布中生成随机变量。(gh-13794)
弃用
np.fromfile
和np.fromstring
在错误数据上将产生错误
在未来的 numpy 发布版本中,函数np.fromfile
和np.fromstring
将在解析错误数据时抛出错误。现在,以前部分甚至无效的数据将悄无声息地返回,而现在将产生DeprecationWarning
。这种弃用还影响了 C 定义的函数PyArray_FromString
和PyArray_FromFile
(gh-13605)
弃用ma.fill_value
中的非标量数组作为填充值
将MaskedArray.fill_value
设置为非标量数组已被弃用,因为广播填充值到数组的逻辑是脆弱的,特别是在切片时。 (gh-13698)
弃用PyArray_As1D
,PyArray_As2D
PyArray_As1D
,PyArray_As2D
已弃用,改用PyArray_AsCArray
代替(gh-14036)
弃用np.alen
弃用np.alen
。使用len
代替。(gh-14181)
弃用了金融函数
根据NEP-32的规定,金融函数fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和rate
已被弃用,并将在 NumPy 1.20 中被移除。这些函数的替代品是 Python 包numpy-financial(gh-14720)
numpy.ma.mask_cols
和numpy.ma.mask_row
的axis
参数已弃用
这个参数总是被忽略的(gh-14996)
np.fromfile
和np.fromstring
在解析错误数据时会出错
在未来的 NumPy 版本中,当解析错误数据时,np.fromfile
和np.fromstring
将抛出错误。之前,部分甚至无效的数据会被悄无声息地返回。这个弃用还会影响 C 定义的函数PyArray_FromString
和PyArray_FromFile
(gh-13605)
弃用ma.fill_value
中的非标量数组作为填充值
将MaskedArray.fill_value
设置为非标量数组已弃用,因为将填充值广播到数组的逻辑不稳定,特别是在切片时(gh-13698)
弃用PyArray_As1D
、PyArray_As2D
PyArray_As1D
、PyArray_As2D
已弃用,请改用PyArray_AsCArray
(gh-14036)
弃用np.alen
弃用np.alen
,请使用len
(gh-14181)
弃用金融函数
根据NEP-32的规定,金融函数fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和rate
已被弃用,并将在 NumPy 1.20 中被移除。这些函数的替代品是 Python 包numpy-financial(gh-14720)
numpy.ma.mask_cols
和numpy.ma.mask_row
的axis
参数已弃用
这个参数总是被忽略的(gh-14996)
过期的弃用函数
-
PyArray_As1D
和PyArray_As2D
已被移除,推荐使用PyArray_AsCArray
(gh-14036) -
np.rank
已被移除。这在 NumPy 1.10 中已被弃用,并被np.ndim
替代(gh-14039) -
在 1.13.0 中过期的对
expand_dims
超出范围的轴的使用已经失效(gh-14051) -
PyArray_FromDimsAndDataAndDescr
和PyArray_FromDims
已被移除(它们总是会触发错误)。请改用PyArray_NewFromDescr
和PyArray_SimpleNew
(gh-14100) -
移除了
numeric.loads
,numeric.load
,np.ma.dump
,np.ma.dumps
,np.ma.load
,np.ma.loads
,请使用pickle
方法代替 (gh-14256) -
arrayprint.FloatFormat
,arrayprint.LongFloatFormat
已被移除,使用FloatingFormat
代替 -
arrayprint.ComplexFormat
,arrayprint.LongComplexFormat
已被移除,使用ComplexFloatingFormat
代替 -
arrayprint.StructureFormat
已被移除,使用StructureVoidFormat
代替。(gh-14259) -
np.testing.rand
已被移除。这在 NumPy 1.11 中已被弃用,已被np.random.rand
替代。(gh-14325) -
numpy/lib/utils.py
中的SafeEval
类已被移除。这在 NumPy 1.10 中已被弃用。使用np.safe_eval
代替。(gh-14335) -
移除了对
np.select
中布尔值和空条件列表的弃用支持 (gh-14583) -
数组顺序仅接受 'C', 'F', 'A', 和 'K'。在 NumPy 1.11 中,更宽松的选项已被弃用。(gh-14596)
-
np.linspace 参数
num
必须是整数。在 NumPy 1.12 中已被弃用。(gh-14620) -
具有多个输出的 UFuncs 必须使用元组作为
out
关键字参数。这结束了在 NumPy 1.10 中开始的弃用。(gh-14682)
文件 numpy/testing/decorators.py
, numpy/testing/noseclasses.py
和 numpy/testing/nosetester.py
已被移除。它们从未被视为公共的 (所有相关对象都在 numpy.testing
命名空间中),自 NumPy 1.15.0 以来导入它们会产生弃用警告。(gh-14567)
兼容性说明
numpy.lib.recfunctions.drop_fields
不再返回 None
如果 drop_fields
用于删除所有字段,先前数组将完全被丢弃并返回 None。现在返回与输入形状相同但没有字段的数组。旧行为可通过以下方式保持:
dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
dropped_arr = None
将空的 recarray 转换为 None (gh-14510)
numpy.argmin/argmax/min/max
如果在数组中存在 NaT
,则返回 NaT
numpy.argmin
, numpy.argmax
, numpy.min
, 和 numpy.max
如果在数组中存在 NaT
,则会返回 NaT
。(gh-14717)
np.can_cast(np.uint64, np.timedelta64, casting='safe')
现在为 False
先前这是 True
- 但是,这与 uint64
无法安全转换为 int64
且导致奇怪类型解析是矛盾的。
如果这影响到您的代码,请先将 uint64
转换为 int64
。(gh-14718)
将随机变量流从 numpy.random.Generator.integers
改为
numpy.random.Generator.integers
存在一个 bug,导致 8 位和 16 位整数类型出现偏倚抽样。修复了该 bug 后,输出流与先前版本有所不同。(gh-14777)
为datetime64
、timedelta64
添加更多的 ufunc 循环
np.datetime('NaT')
的行为应更像float('Nan')
。添加所需的基础设施,使得np.isinf(a)
和np.isnan(a)
能在datetime64
和timedelta64
dtypes 上执行。还为numpy.fmin
和numpy.fmax
添加了特定的循环,用于屏蔽NaT
。这可能需要调整用户界面代码。具体来说,不允许对numpy.isinf
或numpy.isnan
的调用或检查是否引发异常的代码将需要适应,以及错误地调用numpy.fmax
和numpy.fmin
而不是分别调用numpy.maximum
或numpy.minimum
的代码将需要调整。这也影响numpy.nanmax
和numpy.nanmin
。(gh-14841)
移动了 numpy.random
中的模块
作为 API 清理的一部分,numpy.random
中的子模块bit_generator
、philox
、pcg64
、sfc64
、common
、generator
和bounded_integers
被移动到_bit_generator
、_philox
、_pcg64
、_sfc64
、_common
、_generator
和_bounded_integers
,分别表示它们不是公共接口的一部分。(gh-14608)
numpy.lib.recfunctions.drop_fields
现在不会返回 None
如果使用drop_fields
删除所有字段,先前数组将被完全丢弃并返回 None。现在,它返回一个与输入形状相同的数组,但没有字段。可以通过以下方式保留旧行为:
dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
dropped_arr = None
将空的 recarray 转换为 None (gh-14510)
numpy.argmin/argmax/min/max
如果数组中存在NaT
,则返回NaT
如果数组中存在NaT
,numpy.argmin
、numpy.argmax
、numpy.min
和numpy.max
将返回NaT
。 (gh-14717)
np.can_cast(np.uint64, np.timedelta64, casting='safe')
现在为False
先前为True
- 但这与 uint64
无法安全转换为 int64
是不一致的,导致奇怪的类型解析。
如果这影响了你的代码,先将uint64
转换为int64
。(gh-14718)
改变了从numpy.random.Generator.integers
的随机变量流
numpy.random.Generator.integers
存在一个 bug,导致 8 位和 16 位整数类型出现偏倚抽样。修复了该 bug 后,输出流与先前版本有所不同。(gh-14777)
为datetime64
、timedelta64
添加更多的 ufunc 循环
np.datetime('NaT')
现在应该更像float('Nan')
。添加所需的基础设施,使得np.isinf(a)
和np.isnan(a)
可以在datetime64
和timedelta64
数据类型上运行。还为numpy.fmin
和numpy.fmax
添加了特定的循环,用于屏蔽NaT
。这可能需要调整用户端的代码。特别是,不允许调用numpy.isinf
或numpy.isnan
的代码或检查它们是否引发异常的代码将需要适应,而错误地调用numpy.fmax
和numpy.fmin
而不是numpy.maximum
或numpy.minimum
的代码将需要调整。这也影响到了numpy.nanmax
和numpy.nanmin
。 (gh-14841)
移动了numpy.random
中的模块
作为 API 清理的一部分,numpy.random
中的子模块bit_generator
,philox
,pcg64
,sfc64
,common
,generator
和bounded_integers
被移动到分别指示它们不是公共接口的_bit_generator
,_philox
,_pcg64
,_sfc64
, _common
, _generator
和_bounded_integers
。 (gh-14608)
C API 更改
PyDataType_ISUNSIZED(descr)
现在对于结构化数据类型返回 False
以前这个对 itemsize 为 0 的任何数据类型都返回 True,但现在对于 itemsize 为 0 的非灵活数据类型np.dtype([])
返回 false。 (gh-14393)
PyDataType_ISUNSIZED(descr)
现在对于结构化数据类型返回 False
以前这个对 itemsize 为 0 的任何数据类型都返回 True,但现在对于 itemsize 为 0 的非灵活数据类型np.dtype([])
返回 false。 (gh-14393)
新特性
添加我们自己的*.pxd
Cython 导入文件
添加了一个numpy/__init__.pxd
文件。这将用于cimport numpy
(gh-12284)
一个轴的元组现在可以输入到expand_dims
numpy.expand_dims
的axis
关键字现在可以接受一个轴的元组。以前,axis
必须是一个整数。 (gh-14051)
对 64 位 OpenBLAS 的支持
添加对 64 位(ILP64)OpenBLAS 的支持。详细信息请参见site.cfg.example
。 (gh-15012)
添加--f2cmap
选项到 F2PY
允许指定一个文件来加载从 Fortran 到 C 类型映射的定制。 (gh-15113)
添加我们自己的*.pxd
Cython 导入文件
添加了一个numpy/__init__.pxd
文件。这将用于cimport numpy
(gh-12284)
一个轴的元组现在可以输入到expand_dims
numpy.expand_dims
的axis
关键字现在可以接受一个轴的元组。以前,axis
必须是一个整数。 (gh-14051)
对 64 位 OpenBLAS 的支持
添加对 64 位(ILP64)OpenBLAS 的支持。详细信息请参见site.cfg.example
。 (gh-15012)
为 F2PY 添加 --f2cmap
选项
允许从文件加载 Fortran-to-C 类型映射的定制。 (gh-15113)
改进
相同大小的不同 C 数值类型具有独特的名称
在任何给定的平台上, 通过它们的 repr
,np.intc
、np.int_
和 np.longlong
三者以前都难以区分,尽管它们相应的 dtype
有不同的特性。 与这些类型的无符号对应物也存在类似问题,在某些平台上也存在 np.double
和 np.longdouble
的问题。
这些类型现在总是以唯一的 __name__
打印。 (gh-10151)
argwhere
现在在 0d 数组上产生一致的结果
对于 N-d 数组,numpy.argwhere
现在总是产生形状为 (n_non_zero, arr.ndim)
的数组,即使 arr.ndim == 0
也是如此。 在这种情况下,以前的最后一个轴将具有一个维度为 1。 (gh-13610)
为 random.permutation
和 random.shuffle
添加 axis
参数
以前 random.permutation
和 random.shuffle
函数只能沿着第一个轴进行洗牌;现在它们有一个新的 axis
参数,允许沿指定轴进行洗牌。 (gh-13829)
np.random.multivariate_normal
的 method
关键字参数
现在 np.random.multivariate_normal
有一个可用的 method
关键字参数,可能的取值为 {'svd', 'eigh', 'cholesky'}
。 要使用它,写成 `np.random.multivariate_normal(..., method=
为 numpy.fromstring
添加支持复数的功能
现在 numpy.fromstring
可以读取复数。 (gh-14227)
当 axis
不为 None 时,numpy.unique
有一致的轴的顺序
在 numpy.unique
中使用 moveaxis
代替 swapaxes
,这样除了参数中的轴之外的轴的顺序就不会被破坏。 (gh-14255)
numpy.matmul
现在转换为布尔值的输出
在调用 numpy.matmul
并且输出是布尔数组时,它会将数组填充为结果的 uint8 等效值,而不是 0/1。现在它强制输出为 0 或 1(NPY_TRUE
或 NPY_FALSE
)。 (gh-14464)
当范围为2**32
时,numpy.random.randint
生成了错误的值
在确定是否使用 32 位路径还是完整 64 位路径时,引入于 1.17.0 的实现存在错误的检查,错误地将范围为 2**32
的高低范围的随机整数生成重定向到 64 位生成器。 (gh-14501)
为 numpy.fromfile
添加支持复数的功能
现在 numpy.fromfile
可以读取复数。 (gh-14730)
如果编译器命名为 gcc
,则添加 std=c99
GCC 在 5 版之前需要-std=c99
命令行参数。更新的编译器会自动打开 C99 模式。如果编译器名称中带有gcc
,则编译器设置代码将自动添加该代码。(gh-14771)
相同大小的不同 C 数字类型具有唯一名称
在任何平台上,np.intc
,np.int_
和np.longlong
中的两个以前通过repr
看起来一样,尽管它们对应的dtype
具有不同的属性。它们的无符号对应类型存在类似的问题,以及在某些平台上对于np.double
和np.longdouble
这些类型现在始终具有唯一的__name__
。(gh-10151)
argwhere
现在在 0d 数组上产生一致的结果
在 N 维数组上,numpy.argwhere
现在总是产生形状为(n_non_zero,arr.ndim)
的数组,即使arr.ndim == 0
。在这种情况下,以前,最后一个轴的维度是 1。(gh-13610)
为random.permutation
和random.shuffle
添加axis
参数
以前,random.permutation
和random.shuffle
函数只能沿着第一个轴对数组进行洗牌,现在它们有一个新的axis
参数,允许沿指定轴进行洗牌。(gh-13829)
np.random.multivariate_normal
的method
关键字参数
np.random.multivariate_normal
现在具有method
关键字参数,可能的值为{'svd','eigh','cholesky'}
。 要使用它,请写np.random.multivariate_normal(...,method=<method>)
。(gh-14197)
为numpy.fromstring
添加支持复数
现在numpy.fromstring
可以读取复数。(gh-14227)
当axis
不是 None 时,numpy.unique
具有一致的轴顺序
在numpy.unique
中使用moveaxis
而不是swapaxes
,以保持参数中除指定轴外的轴的顺序不被破坏。(gh-14255)
具有布尔输出的numpy.matmul
现在转换为布尔值
调用numpy.matmul
时,如果输出是布尔数组,则会用结果的 uint8 等价物来填充数组,而不是 0/1。现在它会强制输出为 0 或 1(NPY_TRUE
或NPY_FALSE
)。(gh-14464)
当范围为2**32
时,numpy.random.randint
生成的值不正确
在 1.17.0 引入的实现中,在确定是否使用 32 位路径或完整 64 位路径时存在错误检查,将具有高低范围为2**32
的随机整数生成不正确地重定向到 64 位生成器。(gh-14501)
为numpy.fromfile
添加复数支持
现在numpy.fromfile
可以读取复数。(gh-14730)
如果编译器名称为gcc
,则添加std=c99
GCC 版本 5 之前需要使用-std=c99
命令行参数。更新的编译器会自动打开 C99 模式。如果编译器名称中含有gcc
,编译器设置代码将自动添加此代码。(gh-14771)
变动
NaT
现在在数组的末尾排序
NaT
现在在排序中被有效地当作最大的整数处理,因此它将排在数组的末尾。这个更改是为了与NaN
的排序行为保持一致。(gh-12658) (gh-15068)
np.set_printoptions
中的不正确的threshold
会引发TypeError
或ValueError
先前的不正确的threshold
引发ValueError
;现在对于非数字类型引发TypeError
,对于nan
值引发ValueError
。(gh-13899)
当保存带有元数据的数组时发出警告
当通过numpy.save
保存数组时,如果使用metadata
,将会发出UserWarning
。保存这样的数组可能不会保留元数据,如果保留,加载它将导致ValueError
。这个保存和加载的不足之处将在未来的版本中得到解决。(gh-14142)
numpy.distutils
附加行为对于 LDFLAGS 和类似的变化
numpy.distutils
一直重写而不是附加LDFLAGS
和其他类似的编译 Fortran 扩展的环境变量。现在默认行为已更改为追加 - 这在大多数情况下是预期的行为。为保留旧的(覆盖)行为,将NPY_DISTUTILS_APPEND_FLAGS
环境变量设置为 0。这适用于:LDFLAGS
、F77FLAGS
、F90FLAGS
、FREEFLAGS
、FOPT
、FDEBUG
和FFLAGS
。NumPy 1.16 和 1.17 在这种行为改变会影响到使用的编译标志时会发出构建警告。(gh-14248)
移除numpy.random.entropy
而不进行过时警告
numpy.random.entropy
在numpy.random
命名空间中在 1.17.0 版本中被加入。它原本是一个私有的 C 扩展模块,但被公开了。它已被numpy.random.SeedSequence
替换,因此该模块被完全移除。(gh-14498)
增加选项以安静地构建配置,并使用-Werror
进行构建
增加了两个新的配置选项。在build_src
子命令期间,在配置 NumPy 的过程中,通过探测对各种运行时函数和例程的支持来创建文件_numpyconfig.h
和config.h
。此前,在这个阶段非常冗长的编译器输出淹没了更重要的信息。默认情况下,输出被消除了。运行runtests.py --debug-info
将会在build_src
子命令中添加--verbose-cfg
,这将恢复先前的行为。
将CFLAGS=-Werror
添加到配置中将会触发错误。现在runtests.py --warn-error
将会在build
子命令中添加--warn-error
,这将传递到build_ext
和build_lib
子命令。这将在构建 NumPy 本身时将编译警告转换为错误,避免了build_src
子命令的编译调用。
NaT
现在排序到数组的末尾
NaT
现在在排序目的上有效地被视为最大的整数,因此它将排序到数组的末尾。这一改变是为了与NaN
的排序行为保持一致。 (gh-12658) (gh-15068)
np.set_printoptions
中的threshold
不正确,会引发TypeError
或ValueError
以前,一个不正确的threshold
引发了ValueError
;现在对于非数值类型引发TypeError
,对于nan
值引发ValueError
。 (gh-13899)
在保存带有元数据的 dtype 时发出警告
当通过numpy.save
保存数组时带有metadata
时,将发出UserWarning
。保存这样的数组可能不会保留元数据,如果保留了元数据,加载它将导致ValueError
。此保存和加载的不足将在将来的版本中得到解决。 (gh-14142)
numpy.distutils
的追加行为对 LDFLAGS 和类似的环境变量发生了变化
numpy.distutils
一直覆盖而不是追加LDFLAGS
和其他类似的环境变量用于编译 Fortran 扩展。现在默认行为已更改为追加 - 这在大多数情况下是预期行为。为了保留旧的(覆盖)行为,请将NPY_DISTUTILS_APPEND_FLAGS
环境变量设置为 0。这适用于:LDFLAGS
、F77FLAGS
、F90FLAGS
、FREEFLAGS
、FOPT
、FDEBUG
和FFLAGS
。在 NumPy 1.16 和 1.17 中,如果此行为的变化会影响使用的编译标志,将会出现构建警告。 (gh-14248)
删除了未经废弃的numpy.random.entropy
numpy.random.entropy
在 1.17.0 版本中添加到了numpy.random
命名空间中。它原本是一个私有的 c 扩展模块,但被暴露为公共的。它已被numpy.random.SeedSequence
替换,因此该模块被完全移除了。 (gh-14498)
增加选项以安静地构建配置并用-Werror
进行构建
添加了两个新的配置选项。在build_src
子命令期间,作为配置 NumPy 的一部分,通过探测对各种运行时函数和例程的支持,创建了文件_numpyconfig.h
和config.h
。先前,此阶段的非常冗长的编译器输出淹没了更重要的信息。默认情况下输出被压制。运行runtests.py --debug-info
将在build_src
子命令中添加--verbose-cfg
,这将恢复先前的行为。
添加CFLAGS=-Werror
以将警告转换为错误会在配置过程中触发错误。现在,runtests.py --warn-error
将在build
子命令中添加--warn-error
,这将向build_ext
和build_lib
子命令渗透。这将在这些阶段添加编译器标志,并在实际构建 NumPy 本身时将编译器警告转换为错误,避免build_src
子命令的编译器调用。
NumPy 1.17.5 版本发布说明
本版本包含了针对 NumPy 1.17.4 报告的 bug 的修复,以及一些构建改进。本版本支持的 Python 版本为 3.5-3.8。
下游开发者应该使用 Cython >= 0.29.14 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 来避免在 Skylake 架构上出现错误。
建议对新的随机比特生成器感兴趣的开发人员升级到 NumPy 1.18.x 系列,因为它具有更新的文档和许多小的改进。
贡献者
此版本共有 6 人为其做出了贡献。名字前带“+”号的人第一次贡献了一个补丁。
-
Charles Harris
-
Eric Wieser
-
Ilhan Polat
-
Matti Picus
-
Michael Hudson-Doyle
-
Ralf Gommers
合并的拉取请求
此版本共合并了 8 个拉取请求。
-
#14593:MAINT:将 Cython API 清理工作回退到 1.17.x,移除文档
-
#14937:BUG:修复处理数组的 ndmin 参数时的整数大小混淆
-
#14939:BUILD:从 numpy.random 构建中删除 SSE2 标志
-
#14993:MAINT:向 dll lib discovery 添加 Python3.8 分支
-
#15038:BUG:修复 ufunc 对象循环中的引用计数
-
#15067:BUG:异常轨迹被丢弃了
-
#15175:ENH:将测试函数的改进重申到前面。
-
#15213:REL:为 NumPy 1.17.5 版本做准备。
贡献者
此版本共有 6 人为其做出了贡献。名字前带“+”号的人第一次贡献了一个补丁。
-
Charles Harris
-
Eric Wieser
-
Ilhan Polat
-
Matti Picus
-
Michael Hudson-Doyle
-
Ralf Gommers
合并的拉取请求
此版本共合并了 8 个拉取请求。
-
#14593:MAINT:将 Cython API 清理工作回退到 1.17.x,移除文档
-
#14937:BUG:修复处理数组的 ndmin 参数时的整数大小混淆
-
#14939:BUILD:从 numpy.random 构建中删除 SSE2 标志
-
#14993:MAINT:向 dll lib discovery 添加 Python3.8 分支
-
#15038:BUG:修复 ufunc 对象循环中的引用计数
-
#15067:BUG:异常轨迹被丢弃了
-
#15175:ENH:将测试函数的改进重申到前面。
-
#15213:REL:为 NumPy 1.17.5 版本做准备。
NumPy 1.17.4 发布说明
本次发布包含针对 NumPy 1.17.3 报告的错误以及一些构建改进的修复。这个发布支持的 Python 版本是 3.5-3.8。
下游开发者应使用 Cython >= 0.29.13 来支持 Python 3.8,使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上的错误。
亮点
-
修复了
random.random_integers
有偏差的生成 8 位和 16 位整数。 -
修复了* np.einsum *在 Power9 和 z/Linux 上的回归。
-
修复了有符号整数数组的直方图问题。
贡献者
这次发布共有 5 位贡献者。名字后带有“+”的是第一次贡献修补程序的人。
-
Charles Harris
-
克里斯·巴尔 +
-
Matti Picus
-
孙启明 +
-
Warren Weckesser
合并的拉取请求
本次发布合并了 8 个拉取请求。
-
#14758: BLD:声明支持 python 3.8
-
#14781: BUG:随机:从 8 位或 16 位整数中获得有偏差的样本...
-
#14851: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14852: BLD:在 shippable 中添加“apt update”
-
#14855: BUG:修复* np.einsum *在 Power9 Linux 和 z/Linux 上的错误
-
#14857: BUG:lib:修复有符号整数数组的直方图问题。
-
#14858: BLD:防止-flto 优化长双精度表示...
-
#14866: 维护:将 buffer.h -> npy_buffer.h 移动以避免冲突
亮点
-
修复了
random.random_integers
有偏差的生成 8 位和 16 位整数。 -
修复了* np.einsum *在 Power9 和 z/Linux 上的回归。
-
修复了有符号整数数组的直方图问题。
贡献者
这次发布共有 5 位贡献者。名字后带有“+”的是第一次贡献修补程序的人。
-
Charles Harris
-
Chris Burr +
-
Matti Picus
-
孙启明 +
-
Warren Weckesser
合并的拉取请求
本次发布合并了 8 个拉取请求。
-
#14758: BLD:声明支持 python 3.8
-
#14781: BUG:随机:从 8 位或 16 位整数中获得有偏差的样本...
-
#14851: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14852: BLD:在 shippable 中添加“apt update”
-
#14855: BUG:修复* np.einsum *在 Power9 Linux 和 z/Linux 上的错误
-
#14857: BUG: lib: 修复有符号整数数组的直方图问题。
-
#14858: BLD: 避免 -flto 优化长双精度表示...
-
#14866: MAINT: 将 buffer.h 移动到 npy_buffer.h 以避免冲突
NumPy 1.17.3 版本发布说明
此版本包含了针对 NumPy 1.17.2 报告的 bug 的修复以及一些文档改进。此版本支持的 Python 版本为 3.5-3.8。
下游开发者应使用 Cython >= 0.29.13 来支持 Python 3.8,并使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现错误。
亮点
-
Python 3.8 的 Wheels
-
修复了布尔
matmul
,现在使用布尔值而不是整数。
兼容性说明
- 很少使用的
PyArray_DescrCheck
宏已被更改/修复。
贡献者
总共有 7 人为此版本做出了贡献。名字后面带有“+”符号的人第一次贡献了一个补丁。
-
Allan Haldane
-
Charles Harris
-
Kevin Sheppard
-
Matti Picus
-
Ralf Gommers
-
Sebastian Berg
-
Warren Weckesser
合并的拉取请求
总共有 12 个拉取请求合并到了此版本中。
-
#14456: MAINT: 清理 numpy.fft 命名空间中的 pocketfft 模块。
-
#14463: BUG: random.hypergeometric 假设 npy_long 是 npy_int64,挂起…
-
#14502: BUG: random: 撤销 gh-14458 并重新修复 gh-14557。
-
#14504: BUG: 为布尔矩阵乘法添加一个专用循环。
-
#14506: MAINT: 更新 Python 3.8 的 pytest 版本
-
#14512: DOC: random: 修复文档链接,引用了私有子模块。
-
#14513: BUG,MAINT: 基于 clang 分析的修复和小的清理。
-
#14515: BUG: 修复范围为 2**32 时的 randint。
-
#14519: MAINT: 移除熵的 C 扩展模块。
-
#14563: DOC: 移除关于 Pocketfft 许可文件的说明(这里并不存在)。
-
#14578: BUG: random: 创建 random.binomial 的传统实现。
-
#14687: BUG: 正确定义 PyArray_DescrCheck。
亮点
-
Python 3.8 的 Wheels
-
修复了布尔
matmul
,现在使用布尔值而不是整数。
兼容性说明
- 很少使用的
PyArray_DescrCheck
宏已被更改/修复。
贡献者
总共有 7 人为此版本做出了贡献。名字后面带有“+”符号的人第一次贡献了一个补丁。
-
Allan Haldane
-
Charles Harris
-
Kevin Sheppard
-
Matti Picus
-
Ralf Gommers
-
Sebastian Berg
-
Warren Weckesser
合并的拉取请求
总共有 12 个拉取请求合并到了此版本中。
-
#14456: MAINT: 清理 numpy.fft 命名空间中的 pocketfft 模块。
-
#14463: BUG: random.hypergeometric 假设 npy_long 是 npy_int64,挂起…
-
#14502: BUG: random: 撤销 gh-14458 并重新修复 gh-14557。
-
#14504: BUG: 为布尔 matmul 添加一个专门的循环。
-
#14506: MAINT: 更新 Python 3.8 的 pytest 版本。
-
#14512: DOC: random: 修复文档链接,原先引用了私有子模块。
-
#14513: BUG,MAINT: 根据 clang 分析进行一些修复和次要清理。
-
#14515: BUG: 修复 range 为 2**32 时的 randint 问题。
-
#14519: MAINT: 移除熵 C 扩展模块。
-
#14563: DOC: 移除关于 Pocketfft 许可文件的注释(在此处不存在)。
-
#14578: BUG: random: 创建随机二项式的传统实现。
-
#14687: BUG: 正确定义 PyArray_DescrCheck
NumPy 1.17.2 发布说明
这个版本包含针对 NumPy 1.17.1 报告的 bug 的修复以及一些文档改进。最重要的修复是针对 lexsort 当键的类型为 (u)int8 或 (u)int16 时。如果您目前正在使用 1.17 版本,建议升级。
这个版本支持的 Python 版本为 3.5-3.7,Python 2.7 已被弃用。Python 3.8b4 应该可以与发布的源代码包一起工作,但不提供未来支持保证。
下游开发人员应该使用 Cython >= 0.29.13 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 避免在 Skylake 架构上出现错误。PyPI 上的 NumPy 轮子是从 OpenBLAS 开发分支构建的,以避免这些错误。
贡献者
共有 7 人做出贡献。名字前带有“+”符号的人第一次提交补丁。
-
CakeWithSteak +
-
Charles Harris
-
Dan Allan
-
Hameer Abbasi
-
Lars Grueter
-
Matti Picus
-
Sebastian Berg
合并的拉取请求
共有 8 个拉取请求合并到此版本中。
-
#14418: BUG: 修复 aradixsort 的间接索引。
-
#14420: DOC: 修复分派文档中的一个小错误。
-
#14421: BUG: 测试,修复转换为 ctypes 的回归��题。
-
#14430: BUG: 不在私有错误类中显示 Override 模块。
-
#14432: BUG: 修复 assert_allclose 中的最大相对误差报告。
-
#14433: BUG: 修复使用线性斜坡进行填充时的 uint 溢出问题…
-
#14436: BUG: 更新 1.17.x 版本与 1.18.0-dev pocketfft.py。
-
#14446: REL: 为 NumPy 1.17.2 版本做准备。
贡献者
本次发布共有 7 人做出贡献。名字前带有“+”符号的人第一次提交补丁。
-
CakeWithSteak +
-
Charles Harris
-
Dan Allan
-
Hameer Abbasi
-
Lars Grueter
-
Matti Picus
-
Sebastian Berg
合并的拉取请求
共有 8 个拉取请求(pull requests)合并到此版本中。
-
#14418: BUG: 修复 aradixsort 的间接索引。
-
#14420: DOC: 修复分派文档中的一个小错误。
-
#14421: BUG: 测试,修复转换为 ctypes 时的回归问题。
-
#14430: BUG: 不在私有错误类中显示 Override 模块。
-
#14432: BUG: 修复 assert_allclose 中的最大相对误差报告。
-
#14433: BUG: 修复使用线性斜坡进行填充时的 uint 溢出问题…
-
#14436: BUG: 更新 1.17.x 版本,使用 1.18.0-dev 版本的 pocketfft.py。
-
#14446: REL: 为 NumPy 1.17.2 版本发布做准备。
NumPy 1.17.1 发布说明
本次发布包含一些针对 NumPy 1.17.0 报告的错误的修复,以及一些文档和构建改进。支持的 Python 版本为 3.5-3.7,请注意,Python 2.7 已被删除。Python 3.8b3 应该可以与发布的源代码包一起工作,但未来不做保证。
下游开发者应使用 Cython >= 0.29.13 支持 Python 3.8 和 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现问题。PyPI 上的 NumPy 轮子是从 OpenBLAS 开发分支构建的,以避免出现这些问题。
贡献者
共有 17 人为本次发布做出了贡献。名字后面带有“+”符号的是首次贡献补丁的人。
-
Alexander Jung +
-
Allan Haldane
-
Charles Harris
-
Eric Wieser
-
Giuseppe Cuccu +
-
Hiroyuki V. Yamazaki
-
Jérémie du Boisberranger
-
Kmol Yuan +
-
Matti Picus
-
Max Bolingbroke +
-
Maxwell Aladago +
-
Oleksandr Pavlyk
-
Peter Andreas Entschev
-
Sergei Lebedev
-
Seth Troisi +
-
Vladimir Pershin +
-
Warren Weckesser
合并的 pull request
本次发布共合并了 24 个 pull request。
-
#14156:TST:在测试 strided/non-strided exp/log 循环中允许繁琐性
-
#14157:BUG:avx2_scalef_ps 必须是静态的
-
#14158:BUG:删除在 Python 3.7 上导致 SystemError 的杂乱打印。
-
#14159:BUG:修复 Python 3.8 中的弃用警告。
-
#14160:BLD:将缺失的 gcd/lcm 定义添加到 npy_math.h
-
#14161:DOC, BUILD:清理并修复 'build dist'
-
#14166:TST:在 travisCI 测试中添加 3.8-dev。
-
#14194:BUG:移除破损的 clip 封装(后备)
-
#14198:DOC:在 svd 中修复迹 Hermitian 参数的文档。
-
#14199:MAINT:针对因英特尔编译器错误导致测试失败的问题进行解决方法处理
-
#14200:TST:清理 test_pocketfft.py
-
#14201:BUG:使高级索引结果在只读子类中可写…
-
#14236:BUG:修复默认 BitGenerator 名称
-
#14237:ENH:为 np.random 中的冻结分析添加 C 导入模块
-
#14296:TST:将 pytest 版本固定为 5.0.1
-
#14301:BUG:修复 f2py 生成模块初始化中的内存泄漏和 PyMem_Del…
-
#14302:BUG:修复异常消息中的格式错误
-
#14307: 维护:random:将 SeedSequence.pool_size 的类型与 DEFAULT_POOL_SIZE 匹配。
-
#14308: BUG:修复 numpy.random 在平台检测中的错误
-
#14309: ENH:在所有 Linux 构建中启用大页面
-
#14330: BUG:修复
random.permutation(x)
在 x 是字符串时的段错误。 -
#14338: BUG:当对一些空数组进行词法排序时不要失败(#14228)
-
#14339: BUG:修复在各个地方误用 .names 和 .fields(回溯…
-
#14345: BUG:修复在非平凡情况下 structured_to_unstructured 的行为…
-
#14350: REL:准备 1.17.1 发布版
贡献者
总共有 17 人为该版本做出了贡献。带有“+”标记的人第一次贡献了补丁。
-
Alexander Jung +
-
Allan Haldane
-
Charles Harris
-
Eric Wieser
-
Giuseppe Cuccu +
-
Hiroyuki V. Yamazaki
-
Jérémie du Boisberranger
-
Kmol Yuan +
-
Matti Picus
-
Max Bolingbroke +
-
Maxwell Aladago +
-
Oleksandr Pavlyk
-
Peter Andreas Entschev
-
Sergei Lebedev
-
Seth Troisi +
-
Vladimir Pershin +
-
Warren Weckesser
已合并的拉取请求
总共有 24 个拉取请求被合并到这个版本中。
-
#14156: 测试:测试分段/非分段 exp/log 循环允许 fuss
-
#14157: BUG:avx2_scalef_ps 必须是静态的
-
#14158: BUG:移除导致在 python 3.7 上引发 SystemError 的杂乱输出。
-
#14159: BUG:在 python 3.8 中修复 DeprecationWarning。
-
#14160: BLD:将缺少的 gcd/lcm 定义添加到 npy_math.h
-
#14161: 文档,构建:清理和修复(再次) ‘构建分发’
-
#14166: 测试:将 3.8-dev 添加到 travisCI 测试中。
-
#14194: BUG:移除损坏的 clip 包装器(回溯)
-
#14198: 文档:修复 svd 中 hermitian 参数的文档。
-
#14199: 维护:解决导致测试失败的 Intel 编译器错误的临时解决方案
-
#14200: 测试:清理 test_pocketfft.py
-
#14201: BUG:使只读子类上的高级索引结果可写…
-
#14236: BUG:修复默认的 BitGenerator 名称
-
#14237: ENH:为 np.random 中的冻结分析添加 c-导入模块
-
#14296: 测试:将 pytest 版本固定在 5.0.1
-
#14301:BUG:修复了 f2py 生成的模块 init 和PyMem_Del中的泄漏...
-
#14302:BUG:修复了异常消息中的格式错误。
-
#14307:维护:random:将 SeedSequence.pool_size 的类型与 DEFAULT_POOL_SIZE 匹配。
-
#14308:BUG:修复了 numpy.random 在平台检测中的 bug。
-
#14309:ENH:在所有 Linux 构建中启用大页。
-
#14330:BUG:当 x 是字符串时,修复random.permutation(x)中的段错误。
-
#14338:BUG:当排序一些空数组时,不要失败(#14228)。
-
#14339:BUG:修复了各个地方对.names 和.fields 的误用(回溯)...
-
#14345:BUG:修复了 structured_to_unstructured 在非平凡情况下的行为...
-
#14350:REL:准备 1.17.1 版本的发布。
NumPy 1.17.0 发布说明
这个 NumPy 版本包含了一些新特性,应该会显著提高其性能和实用性,请参见下面的亮点摘要。支持的 Python 版本为 3.5-3.7,注意 Python 2.7 已经被移除。Python 3.8b2 应该可以与发布的源码包一起工作,但没有未来的保证。
下游开发人员应该使用 Cython >= 0.29.11 来支持 Python 3.8,以及 OpenBLAS >= 3.7(目前还未发布)以避免在 Skylake 架构上出现问题。PyPI 上的 NumPy wheels 是从 OpenBLAS 开发分支构建的,以避免这些问题。
亮点
-
添加了一个新的可扩展的
random
模块,以及四个可选的随机数生成器和改进的种子设计,用于并行进程。当前的可用位生成器有MT19937,PCG64,Philox和SFC64。请参见下面的新特性。 -
NumPy 的
FFT
实现从 fftpack 更改为 pocketfft,导致更快,更准确的变换,并更好地处理素数长度的数据集。请参见下面的改进部分。 -
新的基数排序和 timsort 排序方法。目前不可能选择将使用哪一种。它们被硬编码到数据类型中,并且当
stable
或mergesort
被传递为方法时使用。请参见下面的改进部分。 -
现在默认情况下可以覆盖 numpy 函数,参见下面的
__array_function__
。
新函数
numpy.errstate
现在也是一个函数修饰器。
废弃功能
当传递int
的位置上的float
时,numpy.polynomial
函数会发出警告。
以前,这个模块中的函数会接受float
值,只要它们是整数(1.0
,2.0
等)。为了与 numpy 的其余部分保持一致,此举现在已被弃用,并且在未来将引发TypeError
。
类似地,在整数位置传递0.5
这样的浮点数现在会引发TypeError
而不是以前的ValueError
。
废弃numpy.distutils.exec_command
和temp_file_name
这些函数的内部使用已经进行了重构,并有更好的替代方案。用subprocess.Popen
替换exec_command
,用tempfile.mkstemp
替换temp_file_name
。
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据读写性质的方式是在创建期间设置writeable
标志。强制将标志设置为可写是危险的。在将来,将不再可能从 python 将writeable
标志切换为True
。此废弃不应影响许多用户,因为以这种方式创建的数组在实践中非常罕见,且仅通过 NumPy C-API 可用。
不应再对 0 维数组调用numpy.nonzero
在 0 维数组上调用numpy.nonzero
的行为令人惊讶,几乎总是不正确的。如果旧的行为是有意的,则可以通过nonzero(atleast_1d(arr))
来保留,而不是nonzero(arr)
,在将来的版本中,这很可能会引发ValueError
。
写入numpy.broadcast_arrays
的结果将会发出警告
通常的numpy.broadcast_arrays
返回一个可写的数组,内部存在重叠,这样写入是不安全的。在将来的版本中,writeable
标志将被设置为False
,并要求用户手动将其设置为True
,如果他们确定这样做是他们想要的。现在写入会发出一个废弃警告,并附有设置writeable
标志True
的说明。请注意,如果在设置之前检查标志,将发现它已经为True
。然而,明确地设置它,正如在将来的版本中所需要的,会清除用于产生废弃警告的内部标志。为了帮助缓解混淆,当访问writeable
标志状态时,会发出额外的FutureWarning来澄清矛盾。
请注意,对于 C 端的缓冲协议,这样的数组将立即返回一个只读缓冲区,除非请求一个可写的缓冲区。如果请求可写的缓冲区将会发出警告。在使用 cython 时,应该在此类数组上使用const
修饰符以避免警告(例如cdef const double[::1] view
)。
未来的变化
在将来的版本中,dtype 中的 shape-1 字段将不会被压缩为标量。
目前,指定为 [(name, dtype, 1)]
或 "1type"
的字段被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。现在将引发 FutureWarning;在将来的版本中,它将被解释为形状为 (1,) 的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与已经等效为 [(name, dtype, n)]
/ "ntype"
且 n>1
的情况一致,它已经等效为 [(name, dtype, (n,)]
/ "(n,)type"
)。
兼容性注意事项
float16
下溢舍入
从不同的浮点精度转换到 float16
在某些边缘情况下使用了不正确的四舍五入。这意味着在罕见情况下,下溢结果现在会四舍进一而不是舍去,改变了结果的最后一位(ULP)。
使用 divmod 时的有符号零
从版本 1.12.0 开始,当使用 divmod
和 floor_divide
函数得到结果为零时,numpy 返回一个负符号零。
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
由于此版本,结果现在正确地作为正符号零返回:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的一个视图,而不是掩码本身。
返回掩码本身是不安全的,因为它可能被直接重塑,从而违反掩码数组代码的期望。现在 mask
的行为与 data
一致,也返回一个视图。
如果需要,可以仍然访问底层掩码 ._mask
。包含 assert x.mask is not y.mask
或类似内容的测试将需要更新。
不要在 numpy.frombuffer
中查找 __buffer__
属性。
查找 __buffer__
属性在 numpy.frombuffer
中是未记录且无效的。该代码已被移除。如果需要,使用 frombuffer(memoryview(obj), ...)
代替。
在 take
、choose
、put
中,out
在内存重叠时会被缓冲。
如果这些函数的输出参数提供并且与其他参数有内存重叠,则现在将对其进行缓冲以避免依赖顺序的行为。
加载时进行解托的拆包需要明确选择
函数 load
和 lib.format.read_array
现在包含一个 allow_pickle
关键字,默认为 False
,以应对 CVE-2019-6446。
旧随机模块中随机流的潜在更改
由于将log
应用于随机浮点数时存在错误,当从beta
, binomial
, laplace
, logistic
, logseries
或 multinomial
进行抽样时,如果在底层的MT19937
随机流中生成0
,则流可能会更改。这种情况发生的概率是\(10^{53}\)分之 1,因此对于任何给定的种子,流发生改变的概率极小。如果在底层生成器中遇到0
,那么现在会放弃生成的不正确值(要么是numpy.inf
,要么是numpy.nan
)。
i0
现在始终返回与输入相同形状的结果
以前,输出会被挤压,因此,例如,只有一个元素的输入将导致返回一个数组标量,并且具有形状如(10, 1)
的输入会产生无法广播到输入的结果。
请注意,我们通常建议使用 SciPy 实现而不是 numpy 实现:它是用 C 编写的适当ufunc
,速度比 numpy 快一个数量级以上。
can_cast
不再假设所有不安全的转换都被允许
先前,can_cast
对于casting='unsafe'
的几乎所有输入都返回True,即使在不可能转换的情况下,例如从结构化dtype
到常规dtype
。已修复此问题,使其与实际转换更一致,例如使用.astype
方法。
ndarray.flags.writeable
现在会更频繁地切换到 true。
在极少情况下,虽然基本数组是可写的,但是不可能将数组从不可写切换为可写。如果一个中间 ndarray.base
对象是可写的,可能会发生这种情况。先前,仅考虑了最深的基本对象来做出这个决定。但是,在极少情况下,这个对象没有必要的信息。在这种情况下,切换为可写是永远不允许的。现在已经修复了这个问题。
C API 变更
维度或步幅输入参数现在通过npy_intp const*
传递
先前,这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个改变是向后兼容的,但是现在允许像下面这样的代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
新特性
新的可扩展 numpy.random
模块,可选择随机数生成器
新的可扩展 numpy.random
模块与四个可选的随机数生成器以及用于并行进程的改进种子设定已经添加。目前可用的Bit Generators是MT19937、PCG64、Philox和SFC64。PCG64
是新的默认值,而MT19937
保留了向后兼容性。请注意,传统的 random 模块未更改,并且现在已被冻结,您当前的结果不会改变。更多信息,请参阅 API 变更描述和顶级视图
文档。
libFLAME
支持构建使用 libFLAME 线性代数包作为 LAPACK 实现的 NumPy,详情请见 libFLAME。
用户自定义的 BLAS 检测顺序
distutils
现在使用一个环境变量,不区分大小写和逗号分隔,来确定 BLAS 库的检测顺序。默认情况下为 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。然而,要强制使用 OpenBlas 只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于安装了 MKL 但希望尝试不同实现的用户可能是有帮助的。
用户自定义 LAPACK 检测顺序
numpy.distutils
现在使用一个环境变量,不区分大小写和逗号分隔,来确定 LAPACK 库的检测顺序。默认情况下为 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。但是,要强制使用 OpenBLAS 只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于安装了 MKL 但希望尝试不同实现的用户可能是有帮助的。
ufunc.reduce
及相关函数现在接受 where
掩码
ufunc.reduce
,sum
,prod
,min
,max
现在都接受一个 where
关键字参数,这可以用于告诉缩减中应包含哪些元素。 对于没有单位元的缩减,还需要传入一个初始值(例如,对于 min
使用initial=np.inf
)。 例如,nansum
的等价物将是 np.sum(a, where=~np.isnan(a))
。
Timsort 和 radix sort 已代替 mergesort 进行稳定排序
radix sort 和 timsort 都已经被实现,并现在用来代替 mergesort。 由于需要保持向后兼容性,排序kind
选项 "stable"
和 "mergesort"
已被制作成对方的别名,实际排序实现取决于数组类型。 对于小于 16 位的小整数类型使用 radix sort,而剩下的类型使用 timsort。 Timsort 在包含已经或几乎排序好的数据时具有改善的性能,并且在随机数据上像 mergesort 一样执行,并且需要(O(n/2))的工作空间。 Timsort 算法的详细信息可以在 CPython listsort.txt 找到。
packbits
和unpackbits
接受order
关键字
order
关键字默认为big
,并且将相应地排序bits。 对于 'order=big'
,3 将变成[0, 0, 0, 0, 0, 0, 1, 1]
,对于order=little
为[1, 1, 0, 0, 0, 0, 0, 0]
unpackbits
现在接受count
参数
count
允许对将要预处理的比特数进行子集化,而不是稍后进行重塑和子集化,使得packbits
操作可逆,而拆包则不那么浪费。 大于可用比特数的计数添加零填充。 负计数则从末尾截取比特,而不是从开头计数。 无计数实现了拆包所有内容的现有行为。
linalg.svd
和linalg.pinv
在 hermitian 输入上可以更快
这些函数现在接受一个hermitian
参数,和 1.14.0 版本中添加到linalg.matrix_rank
的参数相匹配。
divmod 运算现在支持两个timedelta64
操作数
divmod 运算现在支持两个timedelta64
操作数,其类型签名为mm->qm
。
fromfile
现在接受一个offset
参数
这个函数现在接受一个用于二进制文件的offset
关键字参数,指定了从文件当前位置的偏移量(以字节为单位)。默认为0
。
pad
的新模式“empty”
此模式可使数组填充到所需形状,而不初始化新条目。
empty_like
和相关函数现在接受一个shape
参数
empty_like
、full_like
、ones_like
和zeros_like
现在接受一个shape
关键字参数,可用于创建一个新的数组作为原型,同时覆盖其形状。在与__array_function__
协议结合使用时非常有用,允许从类似 NumPy 的库创建新的任意形状数组,当这样的数组用作原型时。
浮点标量实现as_integer_ratio
以匹配内置的浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化dtype
对象可以用多个字段名称进行索引
arr.dtype[['a', 'b']]
现在返回一个等价于arr[['a', 'b']].dtype
的 dtype,以保持与arr.dtype['a'] == arr['a'].dtype
的一致性。
与使用字段列表索引的结构化数组的 dtype 一样,这个 dtype 与原始的itemsize
相同,但只保留字段的子集。
这意味着arr[['a', 'b']]
和arr.view(arr.dtype[['a', 'b']])
是等价的。
.npy
文件支持 unicode 字段名称
引入了一个新的 3.0 格式版本,允许具有非拉丁 1 字段名称的结构化类型。需要时将自动使用此功能。
改进
数组比较断言包括最大差异
诸如testing.assert_allclose
的数组比较测试的错误消息现在包括“最大绝对差异”和“最大相对差异”,而不仅仅是以前的“不匹配”百分比。这些信息使更新绝对误差和相对误差容忍度更容易。
通过 pocketfft 库替换基于 fftpack 的fft
模块
两种实现都有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但是 pocketfft 包含额外的修改,这些修改改善了某些情况下的准确性和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,该算法保持了(O(N log N))的运行时间复杂度,而不是素数长度变差为(O(N*N))。另外,对于接近素数长度的实值 FFT 的准确性得到改善,与复值 FFT 的准确性相当。
numpy.ctypeslib
中ctypes
支持的进一步改进
添加了一个新的numpy.ctypeslib.as_ctypes_type
函数,该函数可以将dtype
转换为最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构体、布尔值和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数装饰器
目前,如果你有一个像这样的函数:
def foo():
pass
如果你想要将整个东西包装在errstate
中,你必须像这样重写它:
def foo():
with np.errstate(...):
pass
但是有了这个改变,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一级缩进
numpy.exp
和numpy.log
的 float32 实现加速
exp
和log
的 float32 实现现在受益于 AVX2/AVX512 指令集,这些指令集在运行时被检测到。exp
的最大 ulp 误差为 2.52,log
的最大 ulp 误差为 3.83。
改进numpy.pad
的性能
大多数情况下,该函数的性能已经得到改善,通过使用预分配的数组填充所需的填充形状,而不是使用串联。
numpy.interp
更稳健地处理无穷大
在一些情况下,interp
以前会返回 nan
,现在会返回适当的无穷大。
fromfile
的 tofile
和 ndarray.dump 对 Pathlib 的支持
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型用于 file
/fid
参数。
专门的 isnan
、isinf
和 isfinite
ufuncs 适用于 bool 和 int 类型
布尔和整数类型无法存储 nan
和 inf
值,这使我们能够提供比以前方法快 250 倍的专门的 ufuncs。
isfinite
支持 datetime64
和 timedelta64
类型
以前,当在这两种类型上使用isfinite
时,会引发 TypeError
nan_to_num
添加了新关键字
nan_to_num
现在接受关键字 nan
、posinf
和 neginf
,允许用户定义替换 nan
、正 np.inf
值和负 np.inf
值的值。
由于分配过大的数组可能导致内存错误,这些错误更具描述性
内存错误的原因经常是不正确的广播,导致非常庞大和错误的形状。错误消息现在包含此形状,以帮助诊断故障的原因。
floor
、ceil
和 trunc
现在尊重内置魔术方法
当在单元素数组上调用这些 ufunc 时,现在会调用__floor__
、__ceil__
和__trunc__
方法,使其与decimal.Decimal
和fractions.Fraction
对象兼容。
quantile
现在适用于Fraction.Fraction和decimal.Decimal
对象
总体而言,这种方法更优雅地处理对象数组,并且在使用精确算术类型时避免了浮点运算。
单元素数组在matmul
中的支持
现在可以使用matmul
(或@
运算符)与单元素数组一起使用。例如,现在可以这样做:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
变更
median
和percentile
系列函数不再警告nan
值
numpy.median
、numpy.percentile
和numpy.quantile
在遇到nan
时曾发出RuntimeWarning
。由于它们返回nan
值,警告是多余的,因此已经移除。
调整timedelta64 % 0
的行为以返回NaT
现在,两个np.timedelta64
操作数之间的模运算在除以零时返回NaT
,而不是返回零
NumPy 函数现在始终支持使用__array_function__
进行覆盖
NumPy 现在始终检查__array_function__
方法,以实现对非 NumPy 数组的 NumPy 函数覆盖,如NEP 18中所述。如果设置了适当的环境变量,此功能在 NumPy 1.16 中可以进行测试,但现在始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
以前,structured_to_unstructured(arr[['a']])
会产生一个与structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。这是偶然发生的。旧行为可以通过structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单的arr['a']
来保留。
clip
现在在内部使用 ufunc
这意味着通过 descr->f->fastclip
在 C 中为自定义 dtypes 注册裁剪函数已过时 - 应改用 ufunc 注册机制,附加到 np.core.umath.clip
ufunc。
clip
还意味着接受 where
和 casting
参数,并且可以被 __array_ufunc__
覆盖。
这一变更的后果是,一些旧 clip
的行为已被弃用:
-
传递
nan
以表示“不裁剪”作为一个或两个边界。无论如何,这在所有情况下都���起作用,可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“不安全”转换。明确使用casting="unsafe"
将使此警告消失。
此外,还存在一些行为改变的特例情况:
-
填充
max < min
已更改以使它在 dtypes 之间更一致,但不应依赖于此。 -
标量
min
和max
参与推广规则,就像其他所有 ufuncs 一样。
__array_interface__
偏移现在按文档中所述工作
接口可能会使用一个被错误地忽略的 offset
值。
savez
中的 pickle 协议设置为 3,用于 force zip64
标志
savez
未使用 force_zip64
标志,这将限制存档大小为 2GB。但是使用标志需要我们使用 pickle 协议 3 来写入 object
数组。使用的协议已调整为 3,意味着存档将无法被 Python2 读取。
使用不存在字段索引的结构化数组将引发 KeyError
而不是 ValueError
对结构类型使用 arr['bad_field']
会引发 KeyError
,以保持与 dict['bad_field']
的一致性。
亮点
-
添加了一个新的可扩展的
random
模块,以及四个可选择的随机数生成器和为并行进程设计的改进生成种子。当前可用的比特生成器有 MT19937, PCG64, Philox, 和 SFC64。请查看下面的新功能部分。 -
NumPy 的
FFT
实现已从 fftpack 更改为 pocketfft,导致转换速度更快,更准确,更好地处理素数长度的数据集。请参见下面的改进部分。 -
新的基数排序和 timsort 排序方法。目前无法选择使用哪种方法。它们是硬编码到数据类型中的,并且当
stable
或mergesort
作为方法传递时会使用。请查看下面的改进部分。 -
现在可以默认重写 numpy 函数,查看下面的
__array_function__
。
新函数
numpy.errstate
现在也是一个函数装饰器
弃用
numpy.polynomial
函数在用 int
代替 float
时会发出警告
之前该模块中的函数可以接受float
值,只要它们是整数(1.0
, 2.0
,等)。为了与 numpy 的其余部分保持一致,现在这样做已经被弃用,并且在将来会引发TypeError
。
类似地,现在在整数位置传递像0.5
这样的浮点数将引发TypeError
,而不是之前的ValueError
。
弃用numpy.distutils.exec_command
和 temp_file_name
这些函数的内部使用已被重构,有更好的替代方案。用subprocess.Popen
替换exec_command
,用tempfile.mkstemp
替换temp_file_name
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一能够知道数据的读写性质的指标是在创建过程中设置的writeable
标志。强制该标志变为可写是很危险的。将来将不可能从 python 将标志切换为True
。这种弃用不应影响很多用户,因为以这种方式创建的数组在实践中非常少见,而且仅通过 NumPy C-API 可用。
不应该在 0 维数组上再调用numpy.nonzero
。
numpy.nonzero
对于 0 维数组的行为令人惊讶,几乎总是不正确的。如果打算保留旧的行为,可以通过使用nonzero(atleast_1d(arr))
代替nonzero(arr)
来保留它而不会发出警告。在将来的版本中,很可能会引发ValueError
。
写入numpy.broadcast_arrays
的结果会发出警告
通常情况下,numpy.broadcast_arrays
返回一个带有内部重叠的可写数组,对其进行写操作是不安全的。将来的版本将将 writeable
标志设置为 False
,并要求用户手动将其设置为 True
,如果他们确定这样做是他们想要的。现在对其进行写操作将发出弃用警告,并提供设置 writeable
标志为 True
的说明。请注意,如果在设置它之前检查标志,您会发现它已经是 True
。然而,在未来版本中,将明确设置它会清除一个用于产生弃用警告的内部标志。为帮助减轻混乱,当访问 writeable
标志状态时将发出额外的 FutureWarning,以澄清矛盾。
请注意,对于 C 端缓冲区协议,此类数组将立即返回只读缓冲区,除非请求可写缓冲区。如果请求可写缓冲区,将发出警告。在使用 Cython 时,应该对这种数组使用 const
修饰符以避免警告(例如 cdef const double[::1] view
)。
numpy.polynomial
中的函数在传递 float
时会发出警告,期望传递 int
以前,此模块中的函数会接受浮点值,只要它们是整数(1.0
, 2.0
等)。为了与 NumPy 的其余部分保持一致,现在已弃用此做法,并且在将来会引发 TypeError
。
类似地,在整数位置传递一个浮点数,现在将引发 TypeError
而不是以前的 ValueError
。
废弃 numpy.distutils.exec_command
和 temp_file_name
这些函数的内部使用已经重构,有更好的替代方案。用 subprocess.Popen
替换 exec_command
,用 tempfile.mkstemp
替换 temp_file_name
。
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一知道数据可读写性的指示是在创建过程中设置的 writeable
标志。强制将标志设置为可写是危险的。将来将不再能够从 Python 将 writeable
标志切换为 True
。此弃用不会影响许多用户,因为以这种方式创建的数组在实践中非常罕见,并且仅通过 NumPy C-API 可用。
不应再在 0d 数组上调用 numpy.nonzero
在 0d 数组上使用 numpy.nonzero
的行为令人意外,使其几乎总是不正确的。 如果旧行为是有意的,则可以通过使用 nonzero(atleast_1d(arr))
而不是 nonzero(arr)
来保留它,而不会引发警告。 在将来的版本中,这很可能会引发 ValueError
。
对numpy.broadcast_arrays
的结果进行写操作将会有警告
通常情况下,numpy.broadcast_arrays
返回一个具有内部重叠的可写数组,使得对其进行写操作是不安全的。 未来版本将会将 writeable
标志设置为 False
,并要求用户手动将其设置为 True
,如果他们确信这是他们想要做的。现在对其进行写操作将会发出弃用警告,并提供设置 writeable
标志 True
的说明。 请注意,如果在设置标志之前检查标志,将会发现它已经是 True
。 显式设置它,如在将来的版本中将需要做的那样,会清除用于生成弃用警告的内部标志。 为了帮助减轻困惑,当访问 writeable
标志状态时将发出另一个 FutureWarning 以澄清矛盾。
请注意,对于 C 侧的缓冲协议,这样的数组将立即返回只读缓冲区,除非请求可写缓冲区。 如果请求可写缓冲区,将发出警告。在使用 Cython 时,应使用 const
修饰符来避免此类数组产生警告(例如 cdef const double[::1] view
)。
未来变更
将来版本中,dtype 中的形状为 1 的字段不会被合并为标量
目前,将字段指定为 [(name, dtype, 1)]
或 "1type"
将被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。 现在会引发警告。 在将来的版本中,它将被解释为形状为(1,)的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与 [(name, dtype, n)]
/ "ntype"
,其中 n>1
已经等同于 [(name, dtype, (n,)]
/ "(n,)type"
))。
将来版本中,dtype 中的形状为 1 的字段��会被合并为标量
目前,将字段指定为 [(name, dtype, 1)]
或 "1type"
将被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。 现在将发出 FutureWarning;在将来版本中,它将被解释为形状为(1,)的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与 [(name, dtype, n)]
/ "ntype"
,其中 n>1
已经等同于 [(name, dtype, (n,)]
/ "(n,)type"
))。
兼容性注意事项
float16
浮点数舍入
从不同的浮点精度转换为float16
在一些极端情况下使用不正确的舍入。这意味着在罕见情况下,次正规结果现在会向上舍入而不是向下舍入,改变了结果的最后一位(ULP)。
使用 divmod 时返回带符号的零
从1.12.0版本开始,当使用divmod
和floor_divide
函数得到结果为零时,numpy 在返回负号零时会出现错误。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
通过此版本发布,结果现在正确地返回为正号的零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的视图,而不是掩码本身
返回掩码本身是不安全的,因为它可能会被就地重塑,这会违反掩码数组代码的期望。mask
的行为现在与data
一致,也会返回一个视图。
如果需要访问底层掩码,可以用._mask
来获取。包含assert x.mask is not y.mask
或类似语句的测试将需要更新。
不要在numpy.frombuffer
中查找__buffer__
属性
在numpy.frombuffer
中查找__buffer__
属性是未记录和无效的。已删除此代码。如果需要,可以使用frombuffer(memoryview(obj), ...)
代替。
out
在内存重叠中被缓冲,适用于take
、choose
、put
如果这些函数的out
参数被提供并且与其他参数存在内存重叠,现在它将被缓冲以避免依赖于顺序的行为。
在加载时进行反序列化需要显式的选择
函数load
和lib.format.read_array
现在默认采用False
作为allow_pickle
关键字的响应,以应对CVE-2019-6446。
在旧的随机模块中随机流的潜在改变
由于在将log
应用于随机浮点数时存在 bug,如果在基础的MT19937
随机流中生成了0
,则取样时可能导致流更改。这种情况发生的概率是(10^{53})中有一个,因此任何给定种子导致流更改的概率极小。如果在基础生成器中遇到0
,那么现在会丢弃错误的值(要么是numpy.inf
,要么是numpy.nan
)。
i0
现在总是返回与输入相同形状的结果。
以前,输出被挤压,例如,只有一个元素的输入会导致返回一个数组标量,并且形状为(10, 1)
的输入将产生不能与输入广播的结果。
请注意,我们通常建议使用 SciPy 实现而不是 numpy 实现:它是用 C 编写的适当的 ufunc,并且比 numpy 实现快一个数量级以上。
can_cast
不再假设允许所有不安全的转换。
以前,can_cast
对于casting='unsafe'
几乎对所有输入返回True,即使在不可能转换的情况下,比如从结构化 dtype 到常规 dtype。这个问题已经修复,使其更符合实际转换的使用,例如 .astype
方法。
ndarray.flags.writeable
可以更频繁地切换为 true。
在罕见的情况下,将数组从不可写入切换为可写入可能是不可能的,尽管基本数组是可写入的。如果一个中间ndarray.base
对象是可写入的,这种情况就会发生。以前,只有最深的基对象被考虑用于这个决定。然而,在罕见的情况下,这个对象没有必要的信息。在这种情况下,从不允许切换到可写入。这个问题现在已经修复。
float16
次正规舍入
从不同的浮点精度转换为float16
在某些边缘情况下使用了不正确的舍入。这意味着在罕见的情况下,次正规结果现在将向上舍入,而不是向下舍入,改变了结果的最后一位(ULP)。
使用 divmod 时的有符号零
从1.12.0
版本开始,当使用divmod
和floor_divide
函数时,numpy 在结果为零时错误地返回了一个带负号的零。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
有了这个版本,结果现在正确地被返回为一个明显的有符号零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的视图,而不是掩码本身
返回掩码本身是不安全的,因为它可能被就地重塑,这将违反掩码数组代码的预期。mask
的行为现在与data
一致,后者也返回一个视图。
如果需要,仍然可以通过._mask
访问底层掩码。包含assert x.mask is not y.mask
或类似语句的测试将需要更新。
不要在numpy.frombuffer
中查找__buffer__
属性
在numpy.frombuffer
中查找__buffer__
属性是未记录且无效的。这段代码已被删除。如果需要,可以使用frombuffer(memoryview(obj), ...)
代替。
在take
、choose
和put
中,用于处理内存重叠的out
现在是缓冲的
如果这些函数的out
参数已经提供并且与其他参数有内存重叠,现在将对其进行缓冲以避免依赖于顺序的行为。
在加载时解封装需要明确选择
函数load
和lib.format.read_array
现在默认带有一个allow_pickle
关键字,以响应CVE-2019-6446。
旧随机模块中对随机流的潜在变更
由于将log
应用于随机浮点数的错误,当从 beta
、binomial
、laplace
、logistic
、logseries
或 multinomial
中的任一生成随机数流时生成了0
时,流可能会发生变化。发生这种情况的概率是 (10^{53}) 中的 1
,因此对于任何给定的种子,流变化的概率都极小。如果在底层生成器中遇到0
,那么现在将删除生成的错误值(numpy.inf
或 numpy.nan
)。
i0
现在总是返回与输入相同形状的结果。
以前,输出会被挤压,例如,只有一个元素的输入会导致返回一个数组标量,并且形状为 (10, 1)
的输入将产生不能对输入进行广播的结果。
请注意,我们通常建议使用 SciPy 的实现而不是 numpy 的实现:它是用 C 编写的合适的 ufunc,速度比 numpy 快一个数量级以上。
can_cast
不再假设所有不安全的转换都是允许的。
以前,can_cast
对于casting='unsafe'
几乎对所有输入都返回True,即使对于不能进行转换的情况(例如,从结构化的 dtype 到常规的 dtype)。已经修复了这个问题,使其更符合实际的转换,例如使用 .astype
方法。
ndarray.flags.writeable
稍微更频繁地可以切换为 true。
在罕见的情况下,可能无法将数组从不可写切换为可写,尽管基础数组是可写的。如果中间的 ndarray.base
对象是可写的,就会发生这种情况。以前,只有最深的基本对象被考虑在内做出这个决定。但是,在罕见的情况下,这个对象没有必要的信息。在这种情况下,切换为可写是永远不被允许的。现在这个问题已经解决了。
C API 变更
维度或步幅输入参数现在由 npy_intp const*
传递
以前这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个更改向后兼容,但现在允许如下代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
维度或步幅输入参数现在由 npy_intp const*
传递
以前这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个更改向后兼容,但现在允许如下代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
新特性
具有可选随机数生成器的新的可扩展的 numpy.random
模块
新的可扩展的 numpy.random
模块与四种可选的随机数生成器和改进的种子设计用于并行进程中的使用已经添加。当前可用的 Bit Generators 有 MT19937, PCG64, Philox, 和 SFC64。PCG64
是新的默认值,而 MT19937
被保留以保持向后兼容性。请注意,旧版随机模块保持不变,并且现在被冻结,您当前的结果不会改变。更多信息请参见 API 变更说明和顶层视图
文档。
libFLAME
支持使用 libFLAME 线性代数包作为 LAPACK 实现来构建 NumPy,详情请参见 libFLAME。
用户定义的 BLAS 检测顺序
distutils
现在使用环境变量来确定 BLAS 库的检测顺序,环境变量是大小写不敏感的,采用逗号分隔。默认情况下 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。然而,要强制使用 OpenBLAS 只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于那些已经安装了 MKL 但希望尝试不同实现的用户可能有帮助。
用户定义的 LAPACK 检测顺序
numpy.distutils
现在使用环境变量来确定 LAPACK 库检测顺序,环境变量是大小写不敏感的,采用逗号分隔。默认情况下 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。然而,要强制使用 OpenBLAS 只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
它会强制使用 OpenBLAS。这对于具有 MKL 安装但希望尝试不同实现的用户可能有所帮助。
ufunc.reduce
和相关函数现在接受where
掩码
ufunc.reduce
,sum
,prod
,min
,max
现在都接受一个where
关键字参数,该参数用于指定哪些元素包含在缩减中。对于没有单位元的缩减,还必须传入一个初始值(例如,对于min
,initial=np.inf
)。例如,nansum
的等效方式将是np.sum(a, where=~np.isnan(a))
。
timsort
和radix sort
已经取代了mergesort
进行稳定排序
radix sort
和timsort
已经被实现并且现在用于取代mergesort
。由于需要保持向后兼容性,排序kind
选项"stable"
和"mergesort"
已经被设置为彼此的别名,实际的排序实现取决于数组类型。对于 16 位或更小的小整数类型使用radix sort
,对于其余类型使用timsort
。timsort
在包含已经或几乎已经排序数据的数据上具有改进的性能,并且在随机数据上表现像mergesort
,需要(O(n/2))的工作空间。timsort
算法的细节可以在CPython listsort.txt找到。
packbits
和unpackbits
接受order
关键字
order
关键字默认为big
,并根据需要重新排序bits。对于'order=big'
,3 将变为[0, 0, 0, 0, 0, 0, 1, 1]
,对于order=little
,将变为[1, 1, 0, 0, 0, 0, 0, 0]
unpackbits
现在接受一个count
参数
count
允许对将要解压的位数进行子集化,而不是后续重塑和子集化,使packbits
操作可逆,并且解压变得不那么浪费。大于可用位数的计数添加零填充。负数的计数将从尾部修剪位,而不是从开头数。None
计数实现了解压所有内容的现有行为。
linalg.svd
和 linalg.pinv
在共轭输入上可能更快
这些函数现在接受一个hermitian
参数,与 1.14.0 中添加到 linalg.matrix_rank
中的参数匹配。
divmod 操作现在支持两个 timedelta64
操作数
divmod 运算现在可以处理两个 timedelta64
操作数,具有类型签名 mm->qm
。
fromfile
现在接受一个 offset
参数
这个函数现在为二进制文件接受一个 offset
关键字参数,指定从文件当前位置的偏移量(以字节为单位)。默认为0
。
pad
的新模式“empty”
这种模式可以将数组填充到所需的形状而不初始化新条目。
empty_like
和相关函数现在接受一个 shape
参数
empty_like
, full_like
, ones_like
和 zeros_like
现在接受一个 shape
关键字参数,该参数可用于创建一个新的数组作为原型,同时覆盖其形状。当与__array_function__
协议一起使用时,特别有用,允许从类似 NumPy 的库中使用这样的数组作为原型创建新的任意形状数组。
浮点数标量实现了as_integer_ratio
以匹配内置浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化的dtype
对象可以用多个字段名称进行索引
arr.dtype[['a', 'b']]
现在返回一个等效于arr[['a', 'b']].dtype
的 dtype,以保持一致性,就像arr.dtype['a'] == arr['a'].dtype
一样。
就像对一组字段进行索引的结构化数组的 dtype 一样,这个 dtype 的itemsize
与原始的相同,但仅保留字段的子集。
这意味着 arr[['a', 'b']]
和 arr.view(arr.dtype[['a', 'b']])
是等效的。
.npy
文件支持 Unicode 字段名
引入了一个新的格式版本 3.0,允许具有非 Latin1 字段名称的结构化类型。在需要时会自动使用。
具有可选择随机数生成器的新可扩展 numpy.random
模块
新的可扩展 numpy.random
模块和四个可选的随机数生成器以及为并行进程设计的改进种子设置已添加。目前可用的 Bit Generators 包括 MT19937、PCG64、Philox 和 SFC64。PCG64
是新的默认值,而 MT19937
保留作为向后兼容。请注意,传统的 random 模块保持不变且已冻结,所以您的当前结果不会改变。更多信息请参阅 API 更改描述 和 顶层视图
文档。
libFLAME
使用 libFLAME 线性代数包作为 LAPACK 实现构建 NumPy 的支持,请参阅 libFLAME 了解详情。
用户定义的 BLAS 检测顺序
distutils
现在使用一个环境变量,大小写不敏感,逗号分隔,来确定 BLAS 库的检测顺序。默认情况下为 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。如果要强制使用 OpenBLAS,只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
这会强制使用 OpenBLAS。对于已安装 MKL 但希望尝试不同实现的用户,这可能会有所帮助。
用户定义的 LAPACK 检测顺序
numpy.distutils
现在使用一个环境变量,大小写不敏感,逗号分隔,来确定 LAPACK 库的检测顺序。默认情况下为 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。如果要强制使用 OpenBLAS,只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
这会强制使用 OpenBLAS。对于已安装 MKL 但希望尝试不同实现的用户,这可能会有所帮助。
ufunc.reduce
和相关函数现在接受一个 where
掩码
ufunc.reduce
、sum
、prod
、min
、max
现在都接受一个 where
关键字参数,该参数可用于指定在规约中包含哪些元素。对于没有标识的规约,还需要传递一个初始值(例如对于 min
,使用 initial=np.inf
)。例如,nansum
的等效形式是 np.sum(a, where=~np.isnan(a))
。
Timsort 和基数排序已替代归并排序用于稳定排序。
基数排序和 timsort 都已实施并现在用于取代合并排序。 由于需要保持向后兼容性,排序 kind
选项 "stable"
和 "mergesort"
已成为彼此的别名,实际的排序实现取决于数组类型。 基数排序用于 16 位或更小的小整数类型,剩下的类型使用 timsort。 Timsort 在包含已排序或几乎已排序数据的数据上具有更好的性能,并在随机数据上类似于合并排序,需要 (O(n/2)) 的工作空间。 关于 timsort 算法的详细信息可以在 CPython listsort.txt 找到。
packbits
和 unpackbits
接受一个 order
关键字。
order
关键字默认为 big
,并相应地排列位。 对于 'order=big'
,3 将变为 [0, 0, 0, 0, 0, 0, 1, 1]
,对于 order=little
,将变为 [1, 1, 0, 0, 0, 0, 0, 0]
。
unpackbits
现在接受一个 count
参数。
count
允许对将要预解压的比特数进行分组,而不是稍后进行重塑和分组,使得 packbits
操作可逆,并且减少了解压时的浪费。 大于可用比特数的计数会添加零填充。 负计数将从末尾修剪比特,而不是从开头计数。 无计数实现解压所有内容的现有行为。
linalg.svd
和 linalg.pinv
在厄米输入上可能更快。
这些函数现在接受一个 hermitian
参数,与 1.14.0 版本中添加到 linalg.matrix_rank
中的参数对应。
divmod 运算现在支持两个 timedelta64
操作数。
divmod 运算符现在可以处理两个 timedelta64
操作数,其类型签名为 mm->qm
。
fromfile
现在接受一个 offset
参数。
这个函数现在接受一个关键字参数 offset
用于二进制文件,该参数指定了相对于文件当前位置的偏移量(以字节为单位)。默认为 0
。
pad
的新模式“empty”。
该模式将数组填充到所需形状,而不初始化新条目。
empty_like
和相关函数现在接受一个 shape
参数。
empty_like
、full_like
、ones_like
和zeros_like
现在接受一个shape
关键字参数,该参数可用于创建一个新的数组作为原型,同时覆盖其形状。当与__array_function__
协议结合使用时,这特别有用,允许从类似 NumPy 的库创建新的任意形状数组,当这样的数组用作原型时。
浮点标量实现as_integer_ratio
以匹配内置的浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化的dtype
对象可以用多个字段名称索引
arr.dtype[['a', 'b']]
现在返回一个等同于arr[['a', 'b']].dtype
的 dtype,以保持与arr.dtype['a'] == arr['a'].dtype
的一致性。
像使用字段列表索引的结构化数组的dtype
一样,此dtype
与原始的具有相同的itemsize
,但只保留字段的子集。
这意味着arr[['a', 'b']]
和arr.view(arr.dtype[['a', 'b']])
是等价的。
.npy
文件支持 unicode 字段名
引入了 3.0 的新格式版本,该版本使非拉丁 1 字段名称的结构化类型可用。需要时会自动使用此版本。
改进
数组比较断言包括最大差异
数组比较测试的错误消息,如testing.assert_allclose
,现在包括“最大绝对差异”和“最大相对差异”,除了以前的“不匹配”百分比。这些信息使更新绝对和相对误差容差更加容易。
用 pocketfft 库替换基于 fftpack 的fft
模块
两个实现具有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但 pocketfft 包含了额外的修改,提高了某些情况下的精度和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,保持(O(N log N))的运行时间复杂度,而不是对于素数长度而言恶化为(O(N*N))。此外,对于近似素数长度的实值 FFT,精度已经提高,并与复值 FFT 相媲美。
在numpy.ctypeslib
中进一步改进了对ctypes
的支持
新添加了一个 numpy.ctypeslib.as_ctypes_type
函数,可以将一个 dtype
转换为最佳猜测的 ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数装饰器
目前,如果你有一个如下的函数:
def foo():
pass
并且你想要将整个事情包装在 errstate
中,你必须像这样重新编写它:
def foo():
with np.errstate(...):
pass
但是有了这个更改,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一个缩进级别
numpy.exp
和 numpy.log
的 float32 实现加速
exp
和 log
的 float32 实现现在受益于在运行时检测到的 AVX2/AVX512 指令集。exp
的最大 ulp 误差为 2.52,而 log
的最大 ulp 误差为 3.83。
改进 numpy.pad
的性能
该函数的性能已经得到了改进,通过用期望的填充形状来填充预分配的数组,而不是使用连接。
numpy.interp
更加健壮地处理了无穷大
在一些以前 interp
会返回 nan
的情况下,它现在返回适当的无限大。
fromfile
、tofile 和 ndarray.dump
的 Pathlib 支持
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型作为 file
/fid
参数。
布尔和整数类型的专门isnan
,isinf
和isfinite
ufuncs
布尔和整数类型无法存储nan
和inf
值,这使我们能够提供比以前方法快 250 倍的专门的 ufuncs。
isfinite
支持datetime64
和timedelta64
类型
以前,isfinite
在这两种类型上使用时会引发TypeError。
新关键字添加到nan_to_num
nan_to_num
现在接受关键字nan
,posinf
和 neginf
,允许用户定义替换nan
,正np.inf
和负np.inf
值的值。
由于分配过大的数组引起的 MemoryErrors 更具描述性
MemoryError 的原因经常是不正确的广播,导致非常大且错误的形状。现在错误的消息中包括这个形状,以帮助诊断失败的原因。
floor
,ceil
和 trunc
现在尊重内置的魔术方法
这些 ufuncs 现在在调用对象数组时调用__floor__
,__ceil__
和__trunc__
方法,使它们与decimal.Decimal
和fractions.Fraction
对象兼容。
quantile
现在适用于fraction.Fraction和decimal.Decimal
对象
一般来说,这更优雅地处理对象数组,并且如果使用精确算术类型,则避免了浮点数操作。
在matmul
中支持对象数组
现在可以使用matmul
(或@
运算符)与对象数组。例如,现在可以执行:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
数组比较断言包括最大差异
数组比较测试的错误消息,例如testing.assert_allclose
,现在包括“最大绝对差”和“最大相对差”,除了以前的“不匹配”百分比。这些信息使得更容易更新绝对和相对误差容限。
通过 pocketfft 库替换基于 fftpack 的fft
模块
两个实现都有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但是 pocketfft 包含了额外的修改,改进了某些情况下的精度和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,保持(O(N log N))的运行时间复杂度,而不是对于素数长度向(O(N*N))的恶化。此外,对于接近素数长度的实值 FFT 的精度已经得到改进,并且和复值 FFT 的精度相媲美。
对numpy.ctypeslib
的ctypes
支持进一步改善
新添加了一个numpy.ctypeslib.as_ctypes_type
函数,它可以将dtype
转换成最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔类型和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数修饰器
目前,如果你有一个像这样的函数:
def foo():
pass
如果你想要用errstate
包装整个东西,你必须像这样重新写:
def foo():
with np.errstate(...):
pass
但是有了这个改变,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一级缩进
numpy.exp
和numpy.log
在 float32 实现上加速了
exp
的 float32 实现现在受益于在运行时检测到的 AVX2/AVX512 指令集。exp
的最大 ulp 误差为 2.52,而log
的最大 ulp 误差为 3.83。
改进了numpy.pad
的性能
大多数情况下,通过将预先分配的数组填充到所需的填充形状中,而不是使用连接操作,提高了函数的性能。
numpy.interp
更加稳健地处理无穷大值
在以前返回 nan
的某些情况下,现在返回适当的无穷大值。
fromfile
、tofile 和 ndarray.dump
支持 Pathlib
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型用于 file
/fid
参数。
专门的 bool 型和 int 型 isnan、isinf 和 isfinite 通用函数
布尔型和整型无法存储 nan
和 inf
值,这使得我们能够提供比先前方法快 250 倍的专门的通用函数。
isfinite 支持 datetime64
和 timedelta64
类型
以前,对这两种类型使用 isfinite
会引发 TypeError。
新增到nan_to_num
中的关键字
nan_to_num
现在接受 nan
、posinf
和 neginf
作为关键字,允许用户定义替代 nan
,正无穷和负无穷 np.inf
值的值。
由于分配过大的数组导致的内存错误更加详细描述
MemoryError 的原因通常是不正确的广播,导致形状非常大且不正确。错误信息现在包括此形状,以帮助诊断故障原因。
floor
、ceil
和 trunc
现在尊重内置的魔法方法
当在对象数组上调用这些 ufuncs 时,现在会调用 __floor__
、__ceil__
和 __trunc__
方法,使其与 decimal.Decimal
和 fractions.Fraction
对象兼容。
quantile
现在适用于 fraction.Fraction 和 decimal.Decimal
对象
一般来说,这更优雅地处理对象数组,并且在使用精确算术类型时避免浮点运算。
在 matmul
中支持对象数组
现在可以使用 matmul
(或 @
操作符)与对象数组。 例如,现在可以执行以下操作:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
变化
median
和 percentile
函数族不再警告 nan
numpy.median
、numpy.percentile
和 numpy.quantile
在遇到 nan
时曾经发出 RuntimeWarning
。 由于它们返回 nan
值,警告是多余的,已经移除。
timedelta64 % 0
的行为已调整为返回 NaT
两个 np.timedelta64
操作数的模运算现在在除以零的情况下返回 NaT
,而不是返回零
现在 NumPy 函数始终支持使用 __array_function__
进行覆盖
现在 NumPy 始终检查 __array_function__
方法以在非 NumPy 数组上实现 NumPy 函数的覆盖,如 NEP 18 中所述。 如果设置了适当的环境变量,该功能在 NumPy 1.16 中可用于测试,但现在始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
以前 structured_to_unstructured(arr[['a']])
会产生与 structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。 这是意外的。 旧行为可以通过 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地 arr['a']
保留。
clip
现在在内部使用 ufunc
这意味着使用 C 通过descr->f->fastclip
为自定义 dtypes 注册剪切函数已被弃用 - 它们应该使用 ufunc 注册机制,附加到np.core.umath.clip
ufunc 上。
这也意味着clip
接受where
和casting
参数,并且可以被__array_ufunc__
覆盖。
此更改的结果是一些旧clip
的行为已被弃用:
-
将
nan
传递为“不要截取”作为一个或两个边界。无论如何,这在所有情况下都不起作用,并且可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“不安全”的强制转换。显式使用casting="unsafe"
将消除此警告。
此外,还存在一些行为更改的边界情况:
-
对
max < min
进行填充已更改为在 dtypes 之间更一致,但不应依赖此行为。 -
标量
min
和max
像其他所有 ufunc 一样参与推广规则。
__array_interface__
偏移现在按照文档运行。
接口可能使用一个错误被忽略的offset
值。
savez
中的 pickle 协议设定为 3,用于force zip64
标志。
savez
在不使用force_zip64
标志时,将存档大小限制为 2GB。但使用该标志需要我们使用 pickle 协议 3 来写入object
数组。使用的协议已升级为 3,这意味着 Python2 无法读取存档。
对不存在字段进行索引的结构化数组引发KeyError
而不是ValueError
。
对结构化类型的arr['bad_field']
引发KeyError
,以保持与dict['bad_field']
的一致性。
median
和percentile
函数族不再警告关于nan
。
numpy.median
,numpy.percentile
,和numpy.quantile
在遇到nan
时曾经发出RuntimeWarning
。由于它们返回nan
值,警告是多余的,因此已被移除。
timedelta64 % 0
行为已调整为返回NaT
。
两个np.timedelta64
操作数进行模运算现在在除以零时返回NaT
,而不是返回零。
NumPy 函数现在始终支持使用__array_function__
进行覆盖。
NumPy 现在始终检查 __array_function__
方法以实现对非 NumPy 数组的 NumPy 函数的覆盖,如 NEP 18 所述。如果设置了适当的环境变量,则该功能在 NumPy 1.16 中可用于测试,但现在已经始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图。
以前 structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或者更简单地使用 arr['a']
来保留旧行为。
clip
现在在底层使用一个 ufunc。
这意味着通过 descr->f->fastclip
在 C 中为自定义 dtypes 注册剪辑函数已过时 - 它们应该使用 ufunc 注册机制,附加到 np.core.umath.clip
ufunc 上。
这也意味着 clip
接受 where
和 casting
参数,并且可以用 __array_ufunc__
覆盖。
这个变化的一个后果是,一些旧 clip
的行为已经过时:
-
将
nan
传递给表示“不剪裁”的一个或两个边界。在任何情况下都无法正常工作,可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“unsafe”强制转换。明确使用casting="unsafe"
将消除此警告。
此外,还有一些行为变化的边缘案例:
-
填充
max < min
的行为已更改以在 dtypes 之间更一致,但不应依赖于此。 -
标量
min
和max
参与促进规则,就像它们在所有其他 ufuncs 中一样。
__array_interface__
偏移现在按照文档正常工作。
接口可能使用了一个被错误忽略的 offset
值。
在 savez
中的 pickle 协议设置为 3 以使用 force zip64
标志。
savez
没有使用 force_zip64
标志,这将限制存档的大小为 2GB。但是使用该标志要求我们使用 pickle 协议 3 来写入 object
数组。所使用的协议已升级到 3,这意味着存档将无法被 Python2 读取。
使用不存在字段索引的结构化数组会引发 KeyError
而不是 ValueError
。
在结构化类型上使用 arr['bad_field']
会引发 KeyError
,以保持与 dict['bad_field']
的一致性。
NumPy 1.16.6 发布说明
NumPy 1.16.6 版本修复了针对 1.16.5 版本报告的错误,并且还从主版中回退了一些增强功能,这些增强功能似乎适用于最后支持 Python 2.7 的版本系列。PyPI 上的 Wheels 已经与 OpenBLAS v0.3.7 链接在一起,这应该修复了 Skylake 系列 CPU 上的错误。
构建此版本的下游开发人员应使用 Cython >= 0.29.2,并且如果使用 OpenBLAS,则使用 OpenBLAS >= v0.3.7。支持的 Python 版本为 2.7 和 3.5-3.7。
亮点
np.testing.utils
函数已从 1.19.0-dev0 进行了更新。这将改善函数文档和错误消息,并将assert_array_compare
函数扩展到其他类型。
新函数
允许 @ 运算符用于对象数组的矩阵乘法。
这是 NumPy 1.17 中添加的一个增强功能,看起来很合理, 可以包括在 LTS 1.16 版本系列中。
兼容性说明
修复布尔类型的矩阵乘法(@运算符)中的回归错误
布尔值被视为整数而不是布尔值,这是与以前行为相比的一个回归。
改进
数组比较断言包括最大差异
数组比较测试的错误消息,如 testing.assert_allclose
,现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。这些信息让更新绝对误差和相对误差容差更容易。
贡献者
共有 10 人为此次发布做出了贡献。
-
蛋糕配牛排
-
查尔斯·哈里斯
-
克里斯·伯尔
-
埃里克·维塞尔
-
费尔南多·萨拉维亚
-
拉斯·格鲁特
-
马蒂·皮库斯
-
马克斯韦尔·阿拉达
-
曾其明
-
沃伦·韦克塞
合并的拉取请求
总共有 14 个拉取请求合并到了此发布版。
-
#14211:BUG:修复使用 linear_ramp 和负值时的 uint 溢出...
-
#14275:BUG:修复允许从 PY2 中解除 PY3_pickle
-
#14340:BUG:修复在各个地方的 .names 和 .fields 的误用(回退...
-
#14423:BUG:测试,修复了转换为 ctypes 的回归错误。
-
#14434:BUG:修复 assert_allclose 中最大相对误差的报告
-
#14509:BUG:修复了布尔矩阵乘法的回归。
-
#14686:BUG:正确定义 PyArray_DescrCheck
-
#14853:BLD:将“apt update”添加到 shippable 中
-
#14854:BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14856:BUG:修复 Power9 Linux 和 z/Linux 上的np.einsum错误
-
#14863: BLD: 防止 -flto 优化长双精度表示...
-
#14864: BUG: lib: 修复带有有符号整数数组的直方图问题。
-
#15172: ENH: 将测试函数的改进回溯。
-
#15191: REL: 准备 1.16.6 版本发布。
亮点
np.testing.utils
函数已从 1.19.0-dev0 更新。这改进了函数文档和错误消息,同时将assert_array_compare
函数扩展到其他类型。
新函数
允许 matmul (@ 运算符) 与对象数组一起使用。
这是在 NumPy 1.17 中添加的增强功能,似乎合理地包含在 LTS 1.16 发布系列中。
允许 matmul (@ 运算符) 与对象数组一起使用。
这是在 NumPy 1.17 中添加的增强功能,似乎合理地包含在 LTS 1.16 发布系列中。
兼容性注意事项
修复 matmul (@ 运算符) 在布尔类型中的回归
布尔值被视为整数而不是布尔值,这是与以前行为不符的回归。
修复 matmul (@ 运算符) 在布尔类型中的回归
布尔值被视为整数而不是布尔值,这是与以前行为不符的回归。
改进
数组比较断言包括最大差异
数组比较测试的错误消息(如 testing.assert_allclose
)现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。此信息使得更新绝对和相对误差容差更加容易。
数组比较断言包括最大差异
数组比较测试的错误消息(如 testing.assert_allclose
)现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。此信息使得更新绝对和相对误差容差更加容易。
贡献者
本次发布共有 10 位贡献者。
-
CakeWithSteak
-
Charles Harris
-
Chris Burr
-
Eric Wieser
-
Fernando Saravia
-
Lars Grueter
-
Matti Picus
-
Maxwell Aladago
-
Qiming Sun
-
Warren Weckesser
合并的拉取请求
本次发布合并了总共 14 个拉取请求。
-
#14211: BUG: 修复使用 linear_ramp 和负值填充时的无符号整数溢出...
-
#14275: BUG: 修复允许从 PY2 反序列化 PY3 pickle
-
#14340: BUG: 修复在各个地方误用 .names 和 .fields (回溯...
-
#14423: BUG: 测试,在转换为 ctypes 中修复回归。
-
#14434: BUG: 修复 assert_allclose 中最大相对误差报告问题
-
#14509: BUG: 修复布尔 matmul 中的回归。
-
#14686: BUG:正确定义 PyArray_DescrCheck
-
#14853: BLD:在 shippable 中添加‘apt update’。
-
#14854: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14856: BUG:修复在 Power9 Linux 和 z/Linux 上的np.einsum错误。
-
#14863: BLD:防止-flto 优化长双精度表示……
-
#14864: BUG:lib:修复带有有符号整数数组的直方图问题。
-
#15172: ENH:将测试函数的改进回溯。
-
#15191: REL:为 1.16.6 版本做准备。
NumPy 1.16.5 版本说明
NumPy 1.16.5 版本修复了对 1.16.4 版本报告的错误,并从主分支中回溯了几个增强功能,这些增强功能似乎适合于最后支持 Python 2.7 的版本系列。在 PyPI 上的安装程序链接到了 OpenBLAS v0.3.7-dev,这应该修复 Skylake 系列 cpu 上的错误。
构建此版本的下游开发人员应使用 Cython >= 0.29.2,并且如果使用 OpenBLAS,则使用 OpenBLAS >= v0.3.7。支持的 Python 版本为 2.7 和 3.5-3.7。
贡献者
总共有 18 人为这个版本做出了贡献。名字后面带“+”的人第一次贡献了补丁。
-
亚历山大·沙钦
-
艾伦·哈尔丹
-
布鲁斯·梅里 +
-
查尔斯·哈里斯
-
科林·斯奈德 +
-
丹·艾伦 +
-
艾米尔 +
-
埃里克·维瑟
-
格雷·贝克 +
-
马克西姆·沙布宁 +
-
马尔滕·范克尔维克
-
马蒂·皮卡斯
-
彼得·安德烈亚斯·恩切夫 +
-
拉尔夫·戈默斯
-
理查德·哈里斯 +
-
塞巴斯蒂安·伯格
-
谢尔盖·列别杰夫 +
-
斯蒂芬·霍耶
合并的拉取请求
总共有 23 个拉取请求合并到了这个版本。
-
#13742:ENH:在 setup.py 中添加项目 URL
-
#13823:TEST, ENH:为 PyPy 修复了测试和 ctypes 代码
-
#13845:BUG:使用 npy_intp 而不是 int 来对数组进行索引
-
#13867:TST:在 nose 导入期间忽略 DeprecationWarning
-
#13905:BUG:修复在布尔索引中的使用后释放。
-
#13933:维护/BUG/DOC:修复 _add_newdocs 中的错误。
-
#13984:BUG:修复 datetime64[ns]的字节顺序翻转
-
#13994:MAINT, BUG:使用 nbytes 也捕捉到内存描述器分配中的空描述。
-
#14042:BUG:np.array 清空了在 PyMemoryView_FromObject 中发生的错误
-
#14043:BUG:修复未定义行为清理器(UBSan)错误。
-
#14044:BUG:确保对/从结构化的强制类型转换得到适当检查。
-
#14045:维护:修复 histogram*d 分发器
-
#14046:BUG:对 histogram2d 分发器进行进一步修正。
-
#14052:BUG:为 Python 2.7 替换 contextlib.suppress。
-
#14056:BUG:修复第三方模块与 Py_LIMITED_API 的编译…
-
#14057:BUG:修复字典构造函数中的内存泄漏。
-
#14058:DOC:在更高层次上记录数组函数。
-
#14084:BUG, DOC:将新的 recfunctions 添加到_all_*中
-
#14162: BUG:移除在 Python 3.7 上导致 SystemError 的杂乱打印
-
#14297: TST:将 pytest 版本固定为 5.0.1。
-
#14322: ENH:在所有 Linux 构建中启用大页面
-
#14346: BUG:修复在非平凡情况下 structured_to_unstructured 的行为…
-
#14382: REL:为 NumPy 1.16.5 发布做准备。
贡献者
总共有 18 人为此发布做出了贡献。带有“+”标记的人第一次为此发布贡献了补丁。
-
Alexander Shadchin
-
Allan Haldane
-
Bruce Merry+
-
Charles Harris
-
Colin Snyder+
-
Dan Allan+
-
Emile+
-
Eric Wieser
-
Grey Baker+
-
Maksim Shabunin+
-
Marten van Kerkwijk
-
Matti Picus
-
Peter Andreas Entschev+
-
Ralf Gommers
-
Richard Harris+
-
Sebastian Berg
-
Sergei Lebedev+
-
Stephan Hoyer
合并的拉取请求
总共有 23 个拉取请求被合并到此版本中。
-
#13742: 增强:在 setup.py 中添加项目网址
-
#13823: TEST, ENH:修复对 PyPy 的测试和 ctypes 代码
-
#13845: BUG:使用 npy_intp 而不是 int 进行数组索引
-
#13867: TST:在 nose 导入期间忽略 DeprecationWarning
-
#13905: BUG:修复布尔索引中的使用后释放
-
#13933: MAINT/BUG/DOC:修复 _add_newdocs 中的错误
-
#13984: BUG:修复 datetime64[ns] 的字节顺序反转
-
#13994: MAINT,BUG:使用 nbytes 以捕捉分配时的空 descr
-
#14042: BUG:修复在 PyMemoryView_FromObject 中发生的 np.array 清空错误
-
#14043: BUG:修复未定义行为检查器(UBSan)错误。
-
#14044: BUG:确保对/从 structured 的强制转换得到妥善检查。
-
#14045: MAINT:修复 histogram*d dispatchers
-
#14046: BUG:对 histogram2d dispatcher 进行进一步修复。
-
#14052: BUG:为 Python 2.7 替换 contextlib.suppress
-
#14056: BUG:修复使用 Py_LIMITED_API 编译第三方模块…
-
#14057: BUG:修复 dict 构造函数中的内存泄漏
-
#14058: DOC:更高级别地记录 array_function。
-
#14084: BUG, DOC:将新的 recfunctions 添加到 all
-
#14162: BUG:移除在 Python 3.7 上导致 SystemError 的杂乱打印
-
#14297: TST: 将 pytest 版本固定为 5.0.1。
-
#14322: ENH: 在所有 Linux 构建中启用巨大页面
-
#14346: BUG: 修复 structured_to_unstructured 在非平凡情况下的行为...
-
#14382: REL: 准备 NumPy 1.16.5 版本的发布。
NumPy 1.16.4 发行说明
NumPy 1.16.4 发布版本修复了针对 1.16.3 发布版本报告的错误,并且还从主分支中回溯了几个看起来适合作为最后支持 Python 2.7 发布系列的增强功能。在 PyPI 上的 wheels 与 OpenBLAS v0.3.7-dev 进行了链接,这可以解决 Skylake 系列 CPU 上的问题。
构建此发布版本的下游开发人员应使用 Cython >= 0.29.2,并且,如果使用 OpenBLAS,则 OpenBLAS > v0.3.7。支持的 Python 版本是 2.7 和 3.5-3.7。
新的弃用项
C-API 包装数组的可写标志
当从 C-API 创建数组以包装一个指向数据的指针时,我们唯一可以判断数据读写性质的方式是在创建时设置 writeable
标志。强制该标志为可写是危险的。未来将不可能从 Python 中将可写标志切换为 True
。此弃用项不会影响许多用户,因为以这种方式创建的数组在实践中非常罕见,并且仅通过 NumPy C-API 可用。
兼容性说明
对随机流的潜在更改
由于在将对随机浮点数进行对数操作时出现 bug,因此在从np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或np.random.multinomial
进行采样时,流可能会发生变化,如果在底层 MT19937 随机流中生成了一个 0。发生这种情况的概率为 (10^{53}) 中的 1,因此针对任何给定的种子,流发生变化的概率是非常小的。如果在底层生成器中遇到 0,则现在会放弃生成的错误值(np.inf
或 np.nan
)。
变更
numpy.lib.recfunctions.structured_to_unstructured
不会挤压单字段视图
之前 structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的挤压结果。这是意外的。旧的行为可以通过structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或者更简单的arr['a']
来保留。
贡献者
总共有 10 人贡献了这个发布版本。名字旁边带有“+”符号的人是首次贡献补丁的。
-
Charles Harris
-
Eric Wieser
-
Dennis Zollo +
-
Hunter Damron +
-
Jingbei Li +
-
Kevin Sheppard
-
Matti Picus
-
Nicola Soranzo +
-
Sebastian Berg
-
Tyler Reddy
合并的拉取请求
总共有 16 个拉取请求合并到了这个发布版本中。
-
#13392: BUG:某些 PyPy 版本缺少 PyStructSequence_InitType2。
-
#13394: MAINT, DEP: 修复了弃用的
assertEquals()
-
#13396: BUG: 修复了单字段类型上的 structured_to_unstructured(回溯)
-
#13549: BLD: 使 CI 通过 pytest 4.5
-
#13552: TST: 在 conftest.py 中注册标记
-
#13559: BUG: 在 arraymultiter_new 中去除空 kwargs 的 ValueError
-
#13560: BUG: 在 crackfortran 中添加 TypeError 到接受的异常中
-
#13561: BUG: 在 descr_to_dtype 中处理子数组
-
#13562: BUG: 保护生成器不受 log(0.0)的影响
-
#13563: BUG: 从 structured_to_unstructured 中始终返回视图
-
#13564: BUG: 检查编译器版本时捕获 stderr 输出
-
#13565: BUG: longdouble(int) 无法正常工作
-
#13587: BUG: distutils/system_info.py 修复丢失的 subprocess 导入(#13523)
-
#13620: BUG,DEP: 修复没有基础的数组设置为可写标志
-
#13641: MAINT: 为 1.16.4 版本做准备。
-
#13644: BUG: 特殊情况下,当打印相对误差、绝对误差时处理对象数组
新的废弃通知
C-API 封装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据可读写性质的指示是在创建过程中设置writeable
标志。强制将标志设置为可写是危险的。在未来,不可能从 Python 将可写标志切换为True
。此废弃应不会影响许多用户,因为用这种方式创建的数组在实践中非常罕见,并且仅能通过 NumPy C-API 获得。
C-API 封装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据可读写性质的指示是在创建过程中设置writeable
标志。强制将标志设置为可写是危险的。在未来,不可能从 Python 将可写标志切换为True
。此废弃应不会影响许多用户,因为用这种方式创建的数组在实践中非常罕见,并且仅能通过 NumPy C-API 获得。
兼容性说明
随机流的潜在变更
由于在对随机浮点数应用对数的程序中存在 bug,如果在从 np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或 np.random.multinomial
中取样时在底层 MT19937 随机流中生成了一个 0,流可能会发生变化。这种情况发生的概率是 (10^{53}) 中的 1,因此对于任何给定的种子,流发生变化的概率极小。如果在底层生成器中遇到 0,那么现在会丢弃产生的错误值(np.inf
或 np.nan
)。
随机流的潜在变化
由于在对随机浮点数应用对数时的 bug,如果在底层 MT19937 随机流中生成了一个 0,那么从 np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或 np.random.multinomial
中取样时,流可能会发生变化。这种情况发生的概率是 (10^{53}) 中的 1,因此对于任何给定的种子,流发生变化的概率极小。如果在底层生成器中遇到 0,那么现在会丢弃产生的错误值(np.inf
或 np.nan
)。
变更
numpy.lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
之前,structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的被挤压的结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地使用 arr['a']
来保留旧的行为。
numpy.lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
之前,structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的被挤压的结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地使用 arr['a']
来保留旧的行为。
贡献者
总共有 10 人为这个版本做出了贡献。名字后面带有“+”的人是第一次贡献补丁。
-
Charles Harris
-
Eric Wieser
-
Dennis Zollo +
-
Hunter Damron +
-
Jingbei Li +
-
Kevin Sheppard
-
Matti Picus
-
Nicola Soranzo +
-
Sebastian Berg
-
Tyler Reddy
合并的拉取请求
总共有 16 个拉取请求合并到此版本。
-
#13392: BUG: 一些 PyPy 版本缺少 PyStructSequence_InitType2。
-
#13394: MAINT, DEP: 修复已弃用的
assertEquals()
-
#13396: BUG: 修复了对单字段类型的 structured_to_unstructured(backport)
-
#13549: BLD: 使用 pytest 4.5 使 CI 重新通过。
-
#13552: TST: 在 conftest.py 中注册标记。
-
#13559: BUG: 移除 arraymultiter_new 中空 kwargs 的 ValueError。
-
#13560: BUG: 在 crackfortran 中添加 TypeError 到被接受的异常中。
-
#13561: BUG: 处理 descr_to_dtype 中的子数组。
-
#13562: BUG: 保护生成器免受 log(0.0)。
-
#13563: BUG: 在 structured_to_unstructured 中始终返回视图 when…
-
#13564: BUG: 检查编译器版本时捕获 stderr。
-
#13565: BUG: longdouble(int) 不起作用。
-
#13587: BUG: distutils/system_info.py 修复缺少的 subprocess 导入(#13523)。
-
#13620: BUG,DEP: 为没有基础的数组修复可写标志设置。
-
#13641: MAINT: 为 1.16.4 版本做准备。
-
#13644: BUG: 在打印 rel-, abs-error 时特殊处理对象数组。
NumPy 1.16.3 发行说明
NumPy 1.16.3 版本修复了针对 1.16.2 版本报告的错误,并从主分支中后向移植了几个增强功能,这些功能对于最后支持 Python 2.7 的发行系列来说是合适的。PyPI 上的 wheel 与 OpenBLAS v0.3.4+ 链接,应该修复了之前 OpenBLAS 版本中发现的已知线程问题。
进行此版本构建的下游开发者应该使用 Cython >= 0.29.2,如果使用 OpenBLAS,则使用 OpenBLAS > v0.3.4。
此版本最显着的变化是,在加载 *.npy
或 *.npz
文件时,反序列化对象数组现在需要显式选择。这种不兼容的变化是为了应对 CVE-2019-6446。
兼容性注意事项
加载时的反序列化需要显式选择
函数 np.load
和 np.lib.format.read_array
现在默认使用 allow_pickle 关键字,响应 CVE-2019-6446。
改进
random.mvnormal 中的协方差转换为双精度
这应该使在检查协方差矩阵的奇异值时使用的公差更有意义。
变更
__array_interface__
偏移现在按照文档所述进行操作
接口可能会使用先前被错误忽略的 offset
值。
兼容性注意事项
加载时的反序列化需要显式选择
函数 np.load
和 np.lib.format.read_array
现在默认使用 allow_pickle 关键字,响应 CVE-2019-6446。
加载时的反序列化需要显式选择
函数 np.load
和 np.lib.format.read_array
现在默认使用 allow_pickle 关键字,响应 CVE-2019-6446。
改进
random.mvnormal 中的协方差转换为双精度
这应该使在检查协方差矩阵的奇异值时使用的公差更有意义。
random.mvnormal 中的协方差转换为双精度
这应该使在检查协方差矩阵的奇异值时使用的公差更有意义。
变更
__array_interface__
偏移现在按照文档所述进行操作
接口可能会使用先前被错误忽略的 offset
值。
__array_interface__
偏移现在按照文档所述进行操作
接口可能会使用先前被错误忽略的 offset
值。
NumPy 1.16.2 发布说明
NumPy 1.16.2 是一个快速发布,修复了 Windows 上遇到的几个问题。支持的 Python 版本为 2.7 和 3.5-3.7。解决的 Windows 问题包括:
-
NumPy 在 Windows 上的动态链接库加载问题
-
Windows 上的 distutils 命令行解析。
还有一个回归修复,修正了由divmod
产生的有符号零,详情请见下文。
构建此发布版的下游开发人员应使用 Cython >= 0.29.2,如果使用 OpenBLAS,则使用 OpenBLAS > v0.3.4。
如果您使用 pip 进行安装,则可能会遇到一个问题,即 pip 没有删除的旧版本的 NumPy 会与当前版本混合在一起,导致ImportError
。该问题在 Debian 衍生发行版中特别常见,因为 pip 被修改过。解决方法是确保之前通过 pip 安装的所有旧版本的 NumPy 都已被删除。有关该问题的讨论,请参见#12736。
兼容性注意事项
使用divmod
时的有符号零
从版本 1.12.0 开始,在使用 divmod
和 floor_divide
函数得到结果为零时,numpy 错误地返回了一个负号的零。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
在此版本中,结果正确返回为一个正号的零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
贡献者
共有 5 人为此发行版做出了贡献。名字后面带有“+”的是第一次为此贡献补丁的人。
-
Charles Harris
-
Eric Wieser
-
Matti Picus
-
Tyler Reddy
-
Tony LaTorre +
已合并的拉取请求
共有 7 个拉取请求被合并到该版本中。
-
#12909: 修复 Azure 中
vmImage
调度功能 -
#12923: 维护:删除复杂的 multiarray 导入失败模式测试
-
#13020: 修复
npy_divmod
中的有符号零行为问题 -
#13026: 维护:在本地平台中添加解析 shell 字符串的函数...
-
#13028: 修复 F90 和 F77 环境变量解析中的回归问题
-
#13038: 修复 extra_compile_args 和 extra_link_args 中的 shell 转义解析问题
-
#13041: 构建:Windows 绝对路径 DLL 加载
兼容性注意事项
使用divmod
时的有符号零
从版本 1.12.0 开始,在使用 divmod
和 floor_divide
函数得到结果为零时,numpy 错误地返回了一个负号的零。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
在此版本中,结果正确返回为一个正号的零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
使用divmod
时的有符号零
从版本 1.12.0 开始,在使用 divmod
和 floor_divide
函数得到结果为零时,numpy 错误地返回了一个负号的零。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
在此版本中,结果正确返回为一个正号的零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
贡献者
一共有 5 位贡献者参与了这个版本的开发。名字旁边带有“+”的人第一次为该项目提交了补丁。
-
Charles Harris
-
Eric Wieser
-
Matti Picus
-
Tyler Reddy
-
Tony LaTorre +
已合并的拉取请求
一共有 7 个拉取请求被合并到这个版本中。
-
#12909: TST: 修复 Azure 中 vmImage 调度
-
#12923: MAINT: 移除对多维数组导入失败模式的复杂测试
-
#13020: BUG: 修复 npy_divmod 中的有符号零行为
-
#13026: MAINT: 添加解析平台本地 shell-字符串的函数…
-
#13028: BUG: 修复对 F90 和 F77 环境变量解析的回归
-
#13038: BUG: 解析 extra_compile_args 和 extra_link_args 中的 shell 转义
-
#13041: BLD: Windows 绝对路径 DLL 加载
NumPy 1.16.1 发布说明
NumPy 1.16.1 发布修复了针对 1.16.0 版本报告的 bug,并且还从主版本中回溯了几项增强功能,这些增强功能适用于最后支持 Python 2.7 的发布系列。PyPI 上的 wheels 和 OpenBLAS v0.3.4+ 链接在一起,应该修复了在以前的 OpenBLAS 版本中发现的已知线程问题。
构建此版本的下游开发者应使用 Cython >= 0.29.2,并且如果使用 OpenBLAS,应使用 OpenBLAS > v0.3.4。
如果你正在使用 pip 进行安装,可能会遇到一个问题,旧版本的 NumPy 未被 pip 删除导致与当前版本混合,出现ImportError
。这个问题在基于 Debian 的发行版中特别常见,原因是 pip 被修改过。修复方法是确保之前由 pip 安装的所有 NumPy 版本都已被删除。可参见 #12736 讨论此问题。请注意,以前这个问题会导致AttributeError
。
贡献者
共有 16 人为此版本做出了贡献。名字后带有“+”的人第一次为此版本贡献了补丁。
-
Antoine Pitrou
-
Arcesio Castaneda Medina +
-
Charles Harris
-
Chris Markiewicz +
-
Christoph Gohlke
-
Christopher J. Markiewicz +
-
Daniel Hrisca +
-
EelcoPeacs +
-
Eric Wieser
-
Kevin Sheppard
-
Matti Picus
-
OBATA Akio +
-
Ralf Gommers
-
Sebastian Berg
-
Stephan Hoyer
-
Tyler Reddy
改进
-
#12767: 增强: 添加 mm->qm 地板除
-
#12768: 增强: 将 np.core.overrides 移植到 C 以提高速度
-
#12769: 增强: 添加 np.ctypeslib.as_ctypes_type(dtype),改进 np.ctypeslib.as_ctypes
-
#12773: 增强: 添加“最大差异”消息到 np.testing.assert_array_equal…
-
#12820: 增强: 添加 mm->qm 除法运算
-
#12890: 增强: 将 _dtype_ctype 添加至命名空间以进行冻结分析
兼容性说明
-
数组比较测试函数发出的更改的错误消息可能会影响文档测试。详细情况请参见下文。
-
从双精度和单精度 denormals 转换为 float16 已经修正。在一些罕见情况下,这可能导致结果向上舍入而不是向下舍入,改变结果的最后一位(ULP)。
新功能
timedelta64
操作现在支持 divmod
操作
divmod
操作现在处理两个 np.timedelta64
操作数,类型签名为mm->qm
。
改进
进一步改进 ctypes
在 np.ctypeslib
中的支持
新 numpy.ctypeslib.as_ctypes_type
函数已添加,可将 dtype 转换为最佳猜测的 ctypes
类型。有了这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔值和非本机字节顺序的整数。
数组比较断言包括最大差异
来自数组比较测试的错误消息,如* np.testing.assert_allclose*,现在包括“最大绝对差异”和“最大相对差异”,而不仅仅是以前的“不匹配”百分比。这些信息使得更新绝对和相对误差容差变得更容易。
更改
调整了timedelta64 % 0
的行为以返回NaT
用两个 np.timedelta64
操作数进行模数运算现在在除零的情况下返回 NaT
,而不是返回零
贡献者
总共有 16 人为此版本做出了贡献。名字后面带有“+”号的人第一次为这个发布提交了补丁。
-
Antoine Pitrou
-
Arcesio Castaneda Medina +
-
Charles Harris
-
Chris Markiewicz +
-
Christoph Gohlke
-
Christopher J. Markiewicz +
-
Daniel Hrisca +
-
EelcoPeacs +
-
Eric Wieser
-
Kevin Sheppard
-
Matti Picus
-
OBATA Akio +
-
Ralf Gommers
-
Sebastian Berg
-
Stephan Hoyer
-
Tyler Reddy
增强
-
#12767: ENH: 添加 mm->q floordiv
-
#12768: ENH: 将 np.core.overrides 移植到 C 以提高速度
-
#12769: ENH: 添加 np.ctypeslib.as_ctypes_type(dtype), 改进 np.ctypeslib.as_ctypes
-
#12773: ENH: 添加“最大差异”消息到 np.testing.assert_array_equal…
-
#12820 : ENH: 添加了 mm->qm divmod
-
#12890: ENH: 为冻结分析向名称空间添加 _dtype_ctype
兼容性说明
-
数组比较测试函数发出的更改错误消息可能会影响 doctests。详情请参见下文。
-
从双精度和单精度 denormal 到 float16 的转换已经修正。在一些罕见情况下,这可能导致结果被舍入而不是舍去,改变结果的最后一位(ULP)。
新特性
divmod 操作现在支持两个 timedelta64
操作数。
divmod 操作现在处理两个 np.timedelta64
操作���,类型签名为 mm->qm
。
divmod 操作现在支持两个 timedelta64
操作数
divmod 操作现在处理两个 np.timedelta64
操作数,类型签名为 mm->qm
。
改进
np.ctypeslib
中对 ctypes
的支持进一步改进
新增了一个numpy.ctypeslib.as_ctypes_type
函数,可用于将dtype转换为最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔值和非本机字节序的整数。
数组比较断言包括最大差异
来自数组比较测试的错误消息,例如np.testing.assert_allclose,现在包括“最大绝对差异”和“最大相对差异”,除了先前的“不匹配”百分比。这些信息使得更新绝对误差和相对误差容差更容易。
在np.ctypeslib
中进一步改进ctypes
支持
新增了一个numpy.ctypeslib.as_ctypes_type
函数,可用于将dtype转换为最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔值和非本机字节序的整数。
数组比较断言包括最大差异
来自数组比较测试的错误消息,例如np.testing.assert_allclose,现在包括“最大绝对差异”和“最大相对差异”,除了先前的“不匹配”百分比。这些信息使得更新绝对误差和相对误差容差更容易。
变化
timedelta64 % 0
的行为调整为返回NaT
两个np.timedelta64
操作数的模操作现在在除以零时返回NaT
,而不是返回零
timedelta64 % 0
的行为调整为返回NaT
两个np.timedelta64
操作数的模操作现在在除以零时返回NaT
,而不是返回零
NumPy 1.16.0 发行说明
此 NumPy 版本是最后一个支持 Python 2.7 的版本,并将作为长期维护版本,直到 2020 年有 bug 修复。对 Python 3.4 的支持已经被移除,支持的 Python 版本为 2.7 和 3.5-3.7。在 PyPI 上的 wheels 与 OpenBLAS v0.3.4+ 链接,应该解决了在之前版本的 OpenBLAS 中发现的已知线程问题。
构建此版本的下游开发者应该使用 Cython >= 0.29,并且,如果使用 OpenBLAS,则 OpenBLAS > v0.3.4。
本版本经过大量重构,包含了许多 bug 修复,改进的代码组织和更好的跨平台兼容性。并不是所有这些改进对用户都是可见的,但它们应该有助于未来更轻松地进行维护。
亮点
-
对 NumPy 函数进行实验性(仅限选择)支持,参见以下的
__array_function__
。 -
matmul
函数现在是一个 ufunc。这提供了更好的性能,并允许使用__array_ufunc__
进行重写。 -
对 ARM 和 POWER 架构的改进支持。
-
对 AIX 和 PyPy 的改进支持。
-
与 ctypes 的互操作改进。
-
对 PEP 3118 的改进支持。
新函数
-
向 numpy.lib.recfuntions 模块添加新的函数以方便结构化赋值的更改:
assign_fields_by_name
structured_to_unstructured
unstructured_to_structured
apply_along_fields
require_fields
查看用户指南 <
docs.scipy.org/doc/numpy/user/basics.rec.html
> 获取更多信息。
新的弃用功能
-
类型字典 numpy.core.typeNA 和 numpy.core.sctypeNA 已被弃用。它们存在 bug 且未经记录,并将在 1.18 版本中删除。使用
numpy.sctypeDict
代替。 -
numpy.asscalar 函数已被弃用。它是更强大的
numpy.ndarray.item
的别名,没有经过测试,对标量失败。 -
numpy.set_array_ops 和 numpy.get_array_ops 函数已经被弃用。作为 NEP 15 的一部分,它们与 C-API 函数
PyArray_SetNumericOps
和PyArray_GetNumericOps
一同被弃用。希望在内建 ufuncs 中重写内部循环函数的用户应该使用PyUFunc_ReplaceLoopBySignature
。 -
numpy.unravel_index
关键字参数dims
已被弃用,使用shape
代替。 -
numpy.histogram
的normed
参数已被弃用。先前已弃用,但没有发出警告。 -
应用于非数值数组的
positive
运算符 (+
) 已被弃用。详细信息请参阅下文。 -
将迭代器传递给栈函数已被弃用
过期的弃用
-
NaT 比较现在返回
False
,不需要警告,结束了 NumPy 1.11 开始的弃用周期。 -
np.lib.function_base.unique
已被移除,结束了 NumPy 1.4 开始的弃用周期。使用numpy.unique
代替。 -
现在多字段索引返回视图而不是副本,结束了 NumPy 1.7 开始的弃用周期。此更改先前在 NumPy 1.14 中尝试,但现在被恢复。
-
np.PackageLoader
和np.pkgload
已被移除。这些在 1.10 中已弃用,没有测试,并且在 1.15 中似乎不再起作用。
未来的变化
- NumPy 1.17 将不再支持 Python 2.7。
兼容性说明
Windows 上的 f2py 脚本
在 Windows 上,用于运行 f2py 的安装脚本现在是一个.exe
文件,而不是一个 *.py
文件,应该在命令行中作为 f2py
运行,只要 Scripts
目录在路径中。在任何版本的 NumPy 中,在不修改路径的情况下作为模块 python -m numpy.f2py [...]
运行 f2py
将可以正常工作。
NaT 比较
与 NaN 的行为一致,除了与 datetime64 或 timedelta64 NaT(“非时间”)值的不等式检查外的所有比较现在始终返回 False
,并且与 NaT 的不等式检查现在始终返回 True
。这包括 NaT 值之间的比较。为了与旧行为兼容,使用 np.isnat
明确检查 NaT,或在进行比较前使用 .astype(np.int64)
将 datetime64/timedelta64 数组转换。
complex64/128 对齐方式已更改
复数类型的内存对齐现在与由两个浮点值组成的 C-struct 相同,而以前等于类型的大小。对于许多用户(例如 x64/unix/gcc)来说,这意味着 complex64 现在是 4 字节对齐而不是 8 字节对齐。一个重要的结果是对齐的结构化 dtype 现在可能具有不同的大小。例如,np.dtype('c8,u1', align=True)
在以前的 x64/gcc 上的 itemsize 为 16,但现在是 12。
更详细地说,complex64 类型现在具有与 C 结构 struct {float r, i;}
相同的对齐方式,根据用于编译 numpy 的编译器,complex128 和 complex256 类型类似。
nd_grid len 已移除
len(np.mgrid)
和 len(np.ogrid)
现在被认为是荒谬的,并引发了 TypeError
。
np.unravel_index
现在接受 shape
关键字参数
以前,只接受 dims
关键字参数来指定用于展开的数组形状。dims
仍然受支持,但现在已被弃用。
多字段视图返回视图而不是副本
索引有多个字段的结构化数组,例如,arr[['f1', 'f3']]
,会返回原始数组的视图,而不是副本。返回的视图通常会有额外的填充字节,对应原始数组中的介入字段,与以往不同,这将会影响如arr[['f1', 'f3']].view('float64')
的代码。自从 numpy 1.7 起,操作会生成FutureWarnings
。此更改于 1.12 版中添加了关于此更改的额外FutureWarnings
。
为帮助用户更新其代码以适应这些更改,已添加了一些功能到numpy.lib.recfunctions
模块,该模块可以安全地允许这样的操作。例如,上面的代码可以替换为structured_to_unstructured(arr[['f1', 'f3']], dtype='float64')
。请参阅用户指南中的“访问多个字段”部分。
C API 更改
NPY_FEATURE_VERSION
因新增内容而增加到 0x0000D:
-
PyUFuncObject.core_dim_flags
-
PyUFuncObject.core_dim_sizes
-
PyUFuncObject.identity_value
-
PyUFunc_FromFuncAndDataAndSignatureAndIdentity
新功能
histogram
中添加了绝对平方误差(ISE)估计器
用于优化 bin 数量的bins='stone'
方法是 Scott's 法则的一般化。Scott's 法则假定分布大致为正态分布,而ISE是一种基于交叉验证的非参数方法。
np.loadtxt
添加了max_rows
关键字
numpy.loadtxt
中的新关键字max_rows
设置了在skiprows
后读取的内容的最大行数,如numpy.genfromtxt
中一样。
np.timedelta64
操作数的模数运算符支持添加
现在支持两个np.timedelta64
类型操作数的模数(余数)操作符。操作数可以具有不同的单位,返回值将与操作数的类型匹配。
改进
numpy 数组的无拷贝 pickle
到协议 4 为止,numpy 数组拾取会创建 2 个数据被序列化的虚假副本。使用 pickle 协议 5 和PickleBuffer
API,现在可以序列化大多数 numpy 数组,而无需使用带外缓冲区进行任何复制,使用带内缓冲区进行 1 次少复制。对于大型数组,这将导致内存使用峰值下降高达 66%。
构建 shell 独立性
NumPy 构建现在不应再直接与主机机器 shell 交互。在适当的地方,exec_command
已被替换为subprocess.check_output
。
np.polynomial.Polynomial 类在 Jupyter 笔记本中以 LaTeX 呈现
在支持的前端中使用时,Polynomial实例现在通过 LaTeX 呈现。当前格式是试验性的,可能会更改。
randint
和choice
现在适用于空分布
即使不需要绘制任何元素,当参数描述空分布时,np.random.randint
和np.random.choice
会引发错误。已修复此问题,以便例如np.random.choice([], 0) == np.array([], dtype=float64)
。
linalg.lstsq
、linalg.qr
和linalg.svd
现在可以使用空数组
以前,当传递空矩阵/空矩阵(行和/或列为零)时,会引发LinAlgError
。现在将返回适当形状的输出。
链式异常,以提供更好的无效 PEP3118 格式字符串错误消息
这应该有助于跟踪问题。
Einsum 优化路径更新和效率改进
Einsum 与当前上游工作同步。
numpy.angle
和 numpy.expand_dims
现在适用于ndarray
子类
特别是它们现在适用于屏蔽数组。
抑制NPY_NO_DEPRECATED_API
编译器警告
将NPY_NO_DEPRECATED_API
设置为 0 将抑制当使用了已弃用的 numpy API 时的当前编译器警告。
np.diff
添加了 kwargs prepend 和 append
新 kwargs prepend
和append
,允许在差异的任一端插入值。类似于ediff1d的选项。现在可以通过prepend=0
轻松地获得cumsum的逆。
更新了 ARM 支持
更新了对 ARM CPU 的支持,以适应 32 位和 64 位目标,以及大端和小端字节顺序。已解决 AARCH32 内存对齐问题。CI 测试已扩展,以包括通过 shippable.com 的 AARCH64 目标服务。
添加构建标志
numpy.distutils
总是覆盖而不是追加 LDFLAGS 和其他类似的用于编译 Fortran 扩展的环境变量。现在,如果将 NPY_DISTUTILS_APPEND_FLAGS环境变量设置为 1,则行为将会追加。这适用于:LDFLAGS、F77FLAGS、F90FLAGS、FREEFLAGS、FOPT、FDEBUG 和 FFLAGS。有关更多详细信息,请参见 gh-11525。
广义 ufunc 签名现在允许固定大小的维度
通过在广义 ufunc 的签名中使用数值,可以指示给定函数需要输入或输出具有给定大小的维度。例如,将极坐标角转换为二维笛卡尔单位向量的函数的签名为()->(2)
;将两个球面角转换为三维单位向量的函数的签名为(),()->(3)
;将两个三维向量的叉乘的函数的签名为(3),(3)->(3)
。
请注意,对于元素函数而言,这些维度并不会受到任何与以字母开头的名称指示的变量不同的对待;循环仍然传递相应的大小,但现在可以依赖于该大小与签名中给定的固定大小相等。
广义通用函数签名现在允许灵活的维度
一些函数,特别是 numpy 将@
实现为matmul
的实现,与广义 ufunc 非常相似,因为它们在核心维度上操作,但由于它们能够处理输入的维度缺失,所以无法将它们呈现为这种形式。为了支持这一点,现在允许在维度名称后面加上一个问号,以指示该维度不一定要存在。
借助这一变化,matmul
的签名可以表示为(m?,n),(n,p?)->(m?,p?)
。这表明,例如,如果第二个操作数只有一个维度,那么对于元素函数来说,将会被视为该输入具有核心形状(n, 1)
,并且输出具有相应的核心形状(m, 1)
。然而,实际的输出数组会移除灵活的维度,也就是说,它将具有形状(..., m)
。同样,如果两个参数只有一个维度,那么输入将被呈现为具有形状(1, n)
和(n, 1)
的元素函数,并且输出为(1, 1)
,而实际的输出数组将具有形状()
。通过这种方式,该签名允许使用一个单一的元素函数来处理四个相关但不同的签名,(m,n),(n,p)->(m,p)
,(n),(n,p)->(p)
,(m,n),(n)->(m)
和(n),(n)->()
。
np.clip
和clip
方法检查内存重叠
对这些函数的out
参数现在始终进行内存重叠测试,以避免在发生内存重叠时出现损坏的结果。
在np.polyfit
中选项cov
的新值unscaled
np.polyfit
函数的cov
参数现在增加了一个可能的值。使用cov='unscaled'
将完全禁用协方差矩阵的缩放(类似于在scipy.optimize.curve_fit
中设置absolute_sigma=True
)。在数据点的(已知)标准误差为 1/σ(σ为高斯分布)时,无缩放矩阵已经是协方差矩阵的正确估计,因此这对于一些情况非常有用。
标量数值类型的详细文档字符串
当应用于诸如numpy.intc
、numpy.int_
和numpy.longlong
等数值类型时,help
函数现在列出该类型的所有别名,区分平台相关和平台无关的别名。
__module__
属性现在指向公共模块
大多数 NumPy 函数的__module__
属性已更新,以指向首选的公共模块,而不是函数所在的模块。这会使 IPython 等工具中的函数显示更加详细,例如,现在你会看到<function 'numpy.sum'>
而不是<function 'numpy.core.fromnumeric.sum'>
。
标记为适用于透明大页的大内存分配
在支持通过 madvise 系统调用的透明超大页的系统上,numpy 现在标记大内存分配可以由超大页支持,从而减少页面错误开销,并在某些错误密集的情况下显着提高性能。在 Linux 上,用于使用超大页的设置为/sys/kernel/mm/transparent_hugepage/enabled,必须至少为madvise。已经将其设置为always的系统将看不到太大的区别,因为内核会自动在适当的情况下使用超大页。
使用非常老的 Linux 内核(~3.x 及更旧)的用户应确保/sys/kernel/mm/transparent_hugepage/defrag未设置为always,以避免由内存碎片整理并发问题导致的性能问题。
Alpine Linux(和其他 musl c 类库版)支持
现在,默认使用 fenv.h 进行浮点状态错误报告。以前,我们的默认设置有时不会报告下溢、上溢和无效的浮点运算。现在我们可以支持像 Alpine Linux 这样的非 glibc 发行版,只要它们提供 fenv.h。
为大数组加速np.block
大数组(大于512 * 512
)现在使用基于直接复制数据到结果数组适当切片的分块算法。这对于这些大数组产生了显著的加速,特别是对于沿超过 2 个维度分块的数组。
arr.ctypes.data_as(...)
保存对 arr 的引用
以前,调用者负责在指针的生命周期内保持数组的存活。
加快了只读数组的 np.take
当 writeable
标志设置为 False
时,np.take
的实现不再不必要地复制源数组。
更多函数支持类似路径的对象
除了文件对象外,np.core.records.fromfile
函数现在还支持 pathlib.Path
和其他类似路径的对象。此外,当使用内存映射(mmap_mode
关键字参数)时,np.load
函数现在也支持类似路径的对象。
在减少期间,ufunc 的行为更好的 identity
通用函数具有一个 .identity
,在对空轴进行.reduce
时使用。
从此版本开始,逻辑二进制 ufunc,logical_and、logical_or 和 logical_xor,现在都具有 bool 类型的 identity
,而以前它们是 int 类型。这恢复了在使用这些 ufunc 减少空对象数组时获得 bool
的 1.14 行为,同时也保持了使用算术 ufunc(如 add
和 multiply
)减少空对象数组时获得 int
的 1.15 行为。
此外,logaddexp 现在具有 -inf
的标识,允许它在空序列上调用,而以前是不允许的。
这得益于新的 PyUFunc_FromFuncAndDataAndSignatureAndIdentity
,它现在允许任意值被用作标识。
改进了从 ctypes 对象的转换
Numpy 一直支持从 ctypes
中获取值或类型,并将其转换为数组或数据类型,但只对较简单的类型行为正确。从这个版本开始,这个警告被解除了——现在:
-
ctypes.Structure
的_pack_
属性,用于模拟 C 的__attribute__((packed))
,受到尊重。 -
所有 ctypes 对象的字节顺序都得到保留
-
ctypes.Union
得到支持 -
不可表示的结构将引发异常,而不是产生危险的不正确结果:
-
位字段不再被解释为子数组
-
指针不再被指向类型所替换
-
一个新的 ndpointer.contents
成员
这与普通 ctypes 数组的.contents
成员相匹配,并可用于在指针的内容周围构建一个 np.array
。这代替了np.array(some_nd_pointer)
,该方法在 1.15 中停止。作为此更改的副作用,ndpointer
现在支持具有重叠字段和填充的数据类型。
matmul
现在是一个 ufunc
numpy.matmul
现在是一个 ufunc,这意味着函数和 __matmul__
运算符现在都可以通过 __array_ufunc__
进行覆盖。它的实现也已经改变。它使用与 numpy.dot
相同的 BLAS 例程,确保其在大矩阵的性能上类似。
linspace
,logspace
和geomspace
的起始和停止数组
这些函数以前仅限于标量停止和开始值,但现在可以接受数组,这些数组将得到适当广播,并导致输出结果的一轴被添加。例如,这可以用于在数据点集之间获取线性插值点。
CI 扩展了额外的服务
我们现在使用额外的免费 CI 服务,感谢提供服务的公司:
-
通过 codecov.io 进行代码覆盖测试
-
通过 shippable.com 进行 Arm 测试
-
在 azure pipelines 上进行额外测试运行
除了我们持续使用 travis,appveyor(用于 wheels)和 LGTM
变化
比较 ufunc 现在将出错而不是返回 NotImplemented
以前,诸如np.equal
的比较 ufunc 如果它们的参数具有结构化 dtype,将返回NotImplemented,以帮助比较运算符如__eq__
处理它们。这不再需要,因为相关逻辑已移动到比较运算符本身(因此碰到需要时,它们会继续返回NotImplemented)。因此,与所有其他 ufunc 一样,比较 ufunc 现在将在结构化 dtype 上出错。
positive
现在对非数字数组会引发弃用警告
以前,+array
无条件返回一个副本。现在,如果数组不是数值(即如果np.positive(array)
引发TypeError
),它将引发DeprecationWarning
。对于重写默认__array_ufunc__
实现的ndarray
子类,TypeError
将被传递。
NDArrayOperatorsMixin
现在实现了矩阵乘法
以前,np.lib.mixins.NDArrayOperatorsMixin
未实现 Python 矩阵乘法运算符(@
)的特殊方法。现在随着matmul
成为 ufunc 并可以使用__array_ufunc__
进行覆盖,情况已发生改变。
在np.polyfit
中协方差矩阵的缩放不同
到目前为止,np.polyfit
在缩放协方差矩阵时使用了非标准因子。即,它不是使用标准的chisq/(M-N)
,而是使用chisq/(M-N-2)
进行缩放,其中 M 是数据点的数量,N 是参数的数量。这种缩放与其他拟合程序(例如scipy.optimize.curve_fit
)不一致,已更改为chisq/(M-N)
。
maximum
和minimum
不再发出警告
作为 1.10 版本引入的代码的一部分,在numpy.maximum
和numpy.minimum
中,当使用 SSE2 语义时,如果遇到 Nan,float32
和float64
会设置无效的浮点状态。这有时会导致RuntimeWarning。在 1.15 中,我们修复了导致警告更加引人注目的不一致性。现在不会发出警告。
Umath 和 multiarray c 扩展模块合并为单个模块
根据NEP 15,这两个模块已合并。之前的np.core.umath和np.core.multiarray是不同的 c 扩展模块。现在它们是对单个np.core/_multiarray_math c 扩展模块的 python 包装器。
扩展了getfield
的有效性检查。
numpy.ndarray.getfield
现在检查 dtype 和 offset 参数,以防止访问无效的内存位置。
NumPy 函数现在支持使用__array_function__
进行覆盖。
NumPy 现在有一个新的实验性机制,通过定义__array_function__
方法来覆盖几乎所有非 NumPy 数组上的所有 NumPy 函数的实现,详见NEP 18。
这个功能目前还没有默认启用,但已发布以方便潜在用户进行实验。详见 NEP 以了解设置适当环境变量的细节。我们预计 NumPy 1.17 版本将默认启用覆盖,并且由于采用了新的 C 编写的实现,性能也会更高。
基于只读缓冲区的数组不能被设置为writeable
。
我们现在不允许对从fromstring(readonly-buffer)
创建的数组设置writeable
标志为 True。
亮点
-
实验性(仅限选择性)支持通过
__array_function__
来覆盖 numpy 函数,详见下方。 -
matmul
函数现在是一个 ufunc。这提供了更好的性能,并允许使用__array_ufunc__
进行覆盖。 -
改善对 ARM 和 POWER 架构的支持。
-
改善对 AIX 和 PyPy 的支持。
-
与 ctypes 的改良互操作性。
-
对 PEP 3118 的改善支持。
新功能
-
添加到numpy.lib.recfuntions模块的新函数以便于结构化赋值的更改:
assign_fields_by_name
structured_to_unstructured
unstructured_to_structured
apply_along_fields
require_fields
查看用户指南<
docs.scipy.org/doc/numpy/user/basics.rec.html
>获取更多信息。
新废弃功能
-
废弃类型词典
numpy.core.typeNA
和numpy.core.sctypeNA
。它们存在 bug 并且没有文档记录,在 1.18 版本中将被移除。请使用numpy.sctypeDict
代替。 -
numpy.asscalar函数已被废弃。它是更强大的
numpy.ndarray.item
的别名,没有经过测试,并且对标量失败。 -
numpy.set_array_ops 和 numpy.get_array_ops 函数已被弃用。作为 NEP 15 的一部分,它们已经与 C-API 函数
PyArray_SetNumericOps
和PyArray_GetNumericOps
一起被弃用。希望覆盖内置 ufuncs 中的内部循环函数的用户应该使用PyUFunc_ReplaceLoopBySignature
。 -
numpy.unravel_index
的关键参数dims
已被弃用,请改用shape
。 -
numpy.histogram
的normed
参数已经被弃用。它以前已经被弃用,但没有发出警告。 -
应用于非数值数组的
positive
运算符(+
)已经被弃用。详细信息请参见下文。 -
将迭代器传递给堆栈函数已经被弃用。
已过时的弃用
-
现在 NaT 的比较返回
False
,而不会有警告,结束了 NumPy 1.11 开始的弃用周期。 -
np.lib.function_base.unique
已被移除,结束了在 NumPy 1.4 中开始的弃用周期。使用numpy.unique
代替。 -
多字段索引现在会返回视图,而不是副本,结束了从 NumPy 1.7 开始的弃用周期。这一变化之前曾在 NumPy 1.14 中尝试过,但现在重新引入。
-
np.PackageLoader
和np.pkgload
已被移除。这些在 1.10 版本时被弃用,没有测试,并且在 1.15 版本似乎已经不再起作用。
未来的变化
- NumPy 1.17 将不再支持 Python 2.7。
兼容性说明
Windows 上的 f2py 脚本
在 Windows 上,用于运行 f2py 的安装脚本现在是一个 .exe
文件,而不是一个 *.py
文件,并且应该在命令行中作为f2py
运行,只要 Scripts
目录在路径中。在任何版本的 NumPy 中,在未修改路径的情况下作为模块python -m numpy.f2py [...]
运行f2py
将可以工作。
NaT 的比较
与 NaN 的行为一致,与 datetime64 或 timedelta64 NaT(“not-a-time”)值进行的除不等比较,现在总是返回False
,而与 NaT 进行不等比较现在总是返回True
。这包括 NaT 值之间的比较。为了与旧行为兼容,使用np.isnat
来显式检查 NaT,或者在进行比较之前将 datetime64/timedelta64 数组转换为.astype(np.int64)
。
complex64/128 的对齐方式已经改变
复杂类型的内存对齐现在与由两个浮点值组成的 C 结构相同,而以前等于类型的大小。对于许多用户(例如在 x64/unix/gcc 上),这意味着 complex64 现在的对齐是 4 字节而不是 8 字节。一个重要的结果是经过对齐的结构化 dtype 现在可能有不同的大小。例如,np.dtype('c8,u1', align=True)
过去在 x64/gcc 上的 itemsize 为 16,但现在是 12。
更详细地说,complex64 类型现在与编译 numpy 的编译器使用的 C-structstruct {float r, i;}
具有相同的对齐方式,并且 complex128 和 complex256 类型类似。
删除了 nd_grid len
len(np.mgrid)
和len(np.ogrid)
现在被视为无意义,并引发TypeError
。
np.unravel_index
现在接受shape
关键字参数
以前,仅接受dims
关键字参数用于指定用于展开的数组的形状。dims
仍然受支持,但现在已被弃用。
多字段视图返回视图而不是副本
使用多个字段对结构化数组进行索引,例如arr[['f1', 'f3']]
,现在返回原始数组的视图而不是副本。返回的视图通常会有与原始数组中的中间字段对应的额外填充字节,这与以前不同,这会影响arr[['f1', 'f3']].view('float64')
等代码。这一变更计划自 numpy 1.7 版开始。此后这一路径上的操作已发出FutureWarnings
。1.12 版还增加了关于这一变更的其他FutureWarnings
。
为了帮助用户更新他们的代码以适应这些变化,已经在numpy.lib.recfunctions
模块中添加了许多函数, 可以安全地执行此类操作。例如,上面的代码可以替换为structured_to_unstructured(arr[['f1', 'f3']], dtype='float64')
。请参阅user guide的“访问多个字段”部分。
Windows 上的 f2py 脚本
在 Windows 上,用于运行 f2py 的安装脚本现在是一个.exe
文件而不是一个*.py
文件,应该在命令行中作为f2py
运行,每当Scripts
目录在路径中时。在任何版本的 NumPy 中,作为模块python -m numpy.f2py [...]
运行f2py
将在不修改路径的情况下起作用。
NaT 比较
与 NaN 的行为一致,除了与 datetime64 或 timedelta64 NaT(“非时间”)值进行不等比较之外的所有比较现在都始终返回False
,而与 NaT 进行不等比较现在总是返回True
。这包括 NaT 值之间的比较。为了兼容旧的行为,可以使用np.isnat
来显式检查 NaT,或者在进行比较之前将 datetime64/timedelta64 数组转换为.astype(np.int64)
。
complex64/128 的对齐方式已更改
复数类型的内存对齐现在与由两个浮点值组成的 C 结构相同,而之前是等于类型的大小。对许多用户(例如在 x64/unix/gcc 上)来说,这意味着 complex64 现在是 4 字节对齐而不是 8 字节对齐。一个重要的结果是,对齐的结构化数据类型现在可能具有不同的大小。例如,np.dtype('c8,u1', align=True)
以前的 itemsize 是 16(在 x64/gcc 上),但现在是 12。
更详细地说,complex64 类型现在具有与 C 结构 struct {float r, i;}
相同的对齐方式,根据用于编译 numpy 的编译器,complex128 和 complex256 类型同样如此。
移除了 nd_grid __len__
len(np.mgrid)
和 len(np.ogrid)
现在被认为是荒谬的,并引发 TypeError
。
np.unravel_index
现在接受 shape
关键字参数
以前,只接受 dims
关键字参数来指定用于展开的数组的形状。 dims
仍然受支持,但现已弃用。
多字段视图返回视图而不是副本
用多个字段索引结构化数组,例如 arr[['f1', 'f3']]
,返回对原始数组的视图而不是副本。返回的视图通常会具有原始数组中介于字段之间的额外填充字节,与之前不同,这将影响诸如 arr[['f1', 'f3']].view('float64')
的代码。自 numpy 1.7 以来,已计划进行此更改。击中此路径的操作已经从那时起产生了 FutureWarnings
。1.12 中还添加了有关此更改的附加 FutureWarnings
。
为帮助用户更新其代码以适应这些变化,已添加了一些函数到 numpy.lib.recfunctions
模块,可以安全地执行此类操作。例如,上述代码可以替换为 structured_to_unstructured(arr[['f1', 'f3']], dtype='float64')
。请参阅用户指南中“访问多个字段”部分。
C API 变更
NPY_FEATURE_VERSION
已增加到 0x0000D,因为增加了:
-
PyUFuncObject.core_dim_flags
-
PyUFuncObject.core_dim_sizes
-
PyUFuncObject.identity_value
-
PyUFunc_FromFuncAndDataAndSignatureAndIdentity
新功能
histogram
中添加了积分平方误差(ISE)估计器
此方法(bins='stone'
)用于优化箱数,是 Scott 法则的一般化。Scott 法则假定分布近似正态分布,而ISE是一种基于交叉验证的非参数方法。
为np.loadtxt
添加了max_rows
关键词
在numpy.loadtxt
中添加了新关键词max_rows
,设置在skiprows
后要读取的内容的最大行数,就像在numpy.genfromtxt
中一样。
为np.timedelta64
操作数添加了模运算符的支持
现在支持np.timedelta64
类型的两个操作数的模运算符(余数运算)。这些操作数可以具有不同的单位,返回值将匹配操作数的类型。
集成的平方误差(ISE)估计器添加到histogram
此方法(bins='stone'
)用于优化箱数,是 Scott 法则的一般化。Scott 法则假定分布近似正态分布,而ISE是一种基于交叉验证的非参数方法。
为np.loadtxt
添加了max_rows
关键词
在numpy.loadtxt
中添加了新关键词max_rows
,设置在skiprows
后要读取的内容的最大行数,就像在numpy.genfromtxt
中一样。
为np.timedelta64
操作数添加了模运算符的支持
现在支持np.timedelta64
类型的两个操作数的模运算符(余数运算)。这些操作数可以具有不同的单位,返回值将匹配操作数的类型。
改进
numpy 数组的无复制拾取
在协议 4 之前,numpy 数组拾取创建了正在序列化的数据的 2 个虚假副本。使用 pickle 协议 5 和PickleBuffer
API,现在可以使用带外缓冲区序列化各种 numpy 数组,而且使用带内缓冲区仅比带外缓冲区少一次复制。对于大型数组,这将导致峰值内存使用量减少高达 66%。
构建 shell 独立性
NumPy 构建现在不应直接与主机机器 shell 进行交互。exec_command
已被subprocess.check_output
替换为适当的位置。
np.polynomial.Polynomial类在 Jupyter 笔记本中以 LaTeX 格式显示
在支持的前端中使用时,Polynomial实例现在可以通过 LaTeX 呈现。当前格式是实验性的,并且可能会更改。
randint
和choice
现在可以在空分布上工作
即使没有需要绘制的元素,np.random.randint
和np.random.choice
在描述空分布的参数时引发错误。已修复此问题,例如np.random.choice([], 0) == np.array([], dtype=float64)
。
linalg.lstsq
,linalg.qr
和linalg.svd
现在可以处理空数组
以前,当传入空矩阵/空矩阵(行和/或列数为零)时会引发LinAlgError
。现在会返回适当形状的输出。
链式异常以提供更好的无效 PEP3118 格式字符串的错误消息
这应该有助于追踪问题。
Einsum 优化路径更新和效率改进
Einsum 已与当前上游工作同步。
numpy.angle
和numpy.expand_dims
现在可用于ndarray
子类
特别是,它们现在适用于蒙版数组。
NPY_NO_DEPRECATED_API
编译器警告抑制
将NPY_NO_DEPRECATED_API
设置为 0 将抑制使用已弃用的 numpy API 时出现的当前编译器警告。
np.diff
增加了 kwargs prepend
和append
新的 kwargs prepend
和 append
,允许在差异的任一端插入值。类似于ediff1d的选项。现在可以通过prepend=0
轻松获得cumsum的逆向操作。
ARM 支持已更新
支持 ARM CPU 已更新,以适应 32 位和 64 位目标,以及大尾和小尾字节排序。已解决了 AARCH32 内存对齐问题。CI 测试已扩展以包括通过 shippable.com 提供的 AARCH64 目标。
附加构建标志
numpy.distutils
总是覆盖而不是附加LDFLAGS和其他类似的用于编译 Fortran 扩展的环境变量。现在,如果设置了NPY_DISTUTILS_APPEND_FLAGS环境变量为 1,行为将会附加。这适用于:LDFLAGS,F77FLAGS,F90FLAGS,FREEFLAGS,FOPT,FDEBUG 和 FFLAGS。更多细节请参见 gh-11525。
广义 ufunc 签名现在允许固定大小的维度
通过在广义 ufunc 的签名中使用数值,可以指示给定函数需要输入或输出具有给定大小的维度。例如,将极角转换为二维笛卡尔单位矢量的函数的签名为()->(2)
;将两个球面角转换为三维单位矢量的函数的签名为(),()->(3)
;而将两个三维矢量的叉乘的函数的签名为(3),(3)->(3)
。
请注意,对于基本函数来说,这些维度不会与以字母开头的变量维度有任何不同的对待;循环仍然会传递相应的大小,但现在可以依赖该大小等于签名中给定的固定大小。
广义 ufunc 签名现在允许灵活的维度
一些函数,特别是 numpy 对@
的实现为matmul
,非常类似于广义 ufuncs,因为它们是在核心维度上操作的,但它们不能被描述为这样,因为它们能够处理输入,其中一个维度是缺失的。为了支持这一点,现在允许在维度名称的尾部加上一个问号来表示该维度不一定要存在。
通过这一补充,matmul
的签名可以表示为(m?,n),(n,p?)->(m?,p?)
。这表明,例如,第二个操作数只有一个维度,在基本函数的目的上,它将被视为输入具有核心形状(n, 1)
,输出具有相应的核心形状(m, 1)
。然而,实际的输出数组会移除灵活的维度,即它的形状为(..., m)
。同样,如果两个参数只有一个维度,那么传递给基本函数的输入将被呈现为具有形状(1, n)
和(n, 1)
,输出为(1, 1)
,而实际的输出数组返回将具有形状()
。通过这种方式,签名允许一种基本函数来使用四个相关但不同的签名,(m,n),(n,p)->(m,p)
、(n),(n,p)->(p)
、(m,n),(n)->(m)
和(n),(n)->()
。
np.clip
和clip
方法会检查内存重叠
这些函数的out
参数现在始终会检测内存重叠,以避免内存重叠时出现损坏的结果。
np.polyfit
中选项cov
的新值unscaled
np.polyfit
函数的cov
参数中添加了一个可能的值。使用cov='unscaled'
会完全禁用协方差矩阵的缩放(类似于在scipy.optimize.curve_fit
中设置absolute_sigma=True
)。这在权重由 1/σ给出,其中σ是(已知的)数据点的(高斯分布)标准误差时会很有用,这种情况下,未缩放的矩阵已经是协方差矩阵的正确估计。
标量数值类型的详细文档字符串
当应用于诸如numpy.intc
、numpy.int_
和numpy.longlong
等数值类型时,help
函数现在列出了该类型的所有别名,区分了平台相关和独立的别名。
__module__
属性现在指向公共模块
大多数 NumPy 函数的__module__
属性已更新,以指向首选的公共模块,从中访问函数,而不是函数所在的模块。这样就可以在诸如 IPython 这样的工具中产生更具信息性的显示,例如,现在不再是<function 'numpy.core.fromnumeric.sum'>
,而是<function 'numpy.sum'>
。
大内存分配标记为适合透明大页
在支持透明大页的系统上,通过 madvise 系统调用,numpy 现在标记大内存分配可以由大页支持,这减少了页面错误的开销,在某些页面错误频繁的情况下显著提高了性能。在 Linux 上,用于使用大页的设置,/sys/kernel/mm/transparent_hugepage/enabled,必须至少为madvise。已经将其设置为always的系统将看不到太大的区别,因为内核将自动在适当的地方使用大页。
使用非常旧的 Linux 内核(~3.x 及更旧)的用户应确保/sys/kernel/mm/transparent_hugepage/defrag未设置为always,以避免由内存碎片化的并发问题导致的性能问题。
Alpine Linux(和其他 musl c 库的发行版)支持
我们现在默认使用fenv.h进行浮点状态错误报告。之前,我们有一个损坏的默认设置,有时不会报告浮点下溢、上溢和无效的浮点运算。现在,我们可以支持非 glibc 发行版,比如 Alpine Linux,只要它们提供fenv.h。
对于大数组,加速np.block
大数组(大于512 * 512
)现在使用基于直接将数据复制到结果数组的适当切片的阻塞算法。这对于这些大数组的速度提升很明显,特别是对于沿着超过 2 个维度被切块的数组。
arr.ctypes.data_as(...)
持有对 arr 的引用
以前,调用者要负责保持数组在指针的生存期内存活。
加速np.take
对只读数组的速度
当writeable
标志设置为False
时,np.take
的实现不再对源数组进行不必要的复制。
为更多函数支持类似路径的对象
np.core.records.fromfile
函数现在除了文件对象之外,还支持pathlib.Path
和其他类似路径的对象。此外,当使用内存映射(mmap_mode
关键字参数)时,np.load
函数现在也支持类似路径的对象。
在减少期间 ufunc 身份的更好行为
通用函数具有一个.identity
,当在空轴上调用.reduce
时使用。
从这个版本开始,逻辑二进制 ufuncs,logical_and、logical_or 和 logical_xor,现在的identity
类型为bool,先前它们的类型为int。这恢复了 1.14 版本的行为,当使用这些 ufuncs 来减少空对象数组时,得到的是bool
,同时也保持了在使用add
和multiply
等算术 ufuncs 来减少空对象数组时得到的是int
的 1.15 版本的行为。
此外,logaddexp 现在具有-inf
的 identity,允许在空序列上调用它,先前是不行的。
这可能归功于新的PyUFunc_FromFuncAndDataAndSignatureAndIdentity
,它现在允许任意值被用作 identity。
改进了从 ctypes 对象的转换
Numpy 一直支持从ctypes
中获取值或类型,并将其转换为数组或 dtype,但只对更简单的类型行为正确。由于此版本的发布,这个警告被解除了:
-
尊重
ctypes.Structure
的_pack_
属性,用于模拟 C 的__attribute__((packed))
。 -
所有 ctypes 对象的字节顺序都被保留
-
支持
ctypes.Union
-
不可表示的构造引发异常,而不是产生危险的不正确的结果:
-
位字段不再被解释为子数组
-
指针不再被替换为它们指向的类型
-
一个新的ndpointer.contents
成员
这与普通 ctypes 数组的.contents
成员相匹配,并且可以用于围绕指针的内容构造一个np.array
。这取代了在 1.15 版本中停止工作的np.array(some_nd_pointer)
。作为这一变化的副作用,ndpointer
现在支持具有重叠字段和填充的 dtypes。
matmul
现在是一个ufunc
numpy.matmul
现在是一个 ufunc,这意味着该函数和__matmul__
运算符现在可以被__array_ufunc__
覆盖。其实现也发生了变化。它使用与numpy.dot
相同的 BLAS 例程,确保其对于大矩阵的性能相似。
linspace
、logspace
和geomspace
的 start 和 stop 数组
这些函数以前限于标量的 stop 和 start 值,但现在可以接受数组,这将被正确地广播,并导致一个具有一个轴前置的输出。例如,这可用于在点集之间获取线性插值点。
CI 扩展了额外的服务
我们现在使用额外的免费 CI 服务,感谢提供这些服务的公司:
-
通过 codecov.io 进行代码覆盖测试
-
通过 shippable.com 进行 Arm 测试
-
在 azure pipelines 上进行了额外的测试运行
除了我们继续使用 travis、appveyor(用于 wheels)和 LGTM
numpy 数组的无拷贝 pickling
在协议 4 之前,numpy 数组的 pickling 会创建 2 个数据的虚假副本。使用 pickle 协议 5 和PickleBuffer
API,可以在无需任何副本的情况下使用带外带缓冲区序列化大量不同的 numpy 数组,以及在内带缓冲区使用一个较少的副本。对于大的数组,最大内存使用量可减少高达 66%。
构建 shell 独立性
NumPy 构建不再直接与主机机器 shell 交互。在适当的情况下,exec_command
已被subprocess.check_output
替换。
np.polynomial.Polynomial类现在在 Jupyter 笔记本中以 LaTeX 格式呈现。
当用在支持的前端时,Polynomial实例现在通过 LaTeX 渲染。当前格式是实验性的,可能会发生变化。
randint
和choice
现在适用于空分布
即使没有需要绘制的元素,当参数描述一个空的分布时,np.random.randint
和np.random.choice
也会引发错误。已修复此问题,以便例如np.random.choice([], 0) == np.array([], dtype=float64)
。
linalg.lstsq
, linalg.qr
和linalg.svd
现在可以处理空数组。
以前,当传入空矩阵/空矩阵(行和/或列为零)时会引发LinAlgError
。现在返回适当形状的输出。
链式异常以提供更好的无效 PEP3118 格式字符串错误消息
这应该有助于查找问题。
Einsum 优化路径更新和效率改进
Einsum 已与当前上游工作同步。
numpy.angle
和numpy.expand_dims
现在适用于ndarray
子类
特别是它们现在适用于掩码数组。
NPY_NO_DEPRECATED_API
编译器警告抑制
将NPY_NO_DEPRECATED_API
设置为 0 将抑制当前编译器在使用废弃的 numpy API 时的警告。
np.diff
添加了 kwargs prepend 和 append
新的 kwargs prepend
和append
允许在差异的两端插入值。类似于ediff1d的选项。现在可以通过prepend=0
轻松得到cumsum的逆。
ARM 支持已更新。
支持 ARM CPU 已更新,以适应 32 位和 64 位目标,以及大端和小端字节顺序。解决了 AARCH32 内存对齐问题。通过 shippable.com 的服务,CI 测试已扩展到包括 AARCH64 目标。
追加到构建标志
numpy.distutils
一直覆盖而不是追加LDFLAGS和其他类似的用于编译 Fortran 扩展的环境变量。现在,如果将NPY_DISTUTILS_APPEND_FLAGS环境变量设置为 1,行为将会追加。这适用于:LDFLAGS、F77FLAGS、F90FLAGS、FREEFLAGS、FOPT、FDEBUG和FFLAGS。更多详细信息见 gh-11525。
广义 ufunc 签名现在允许固定大小的维度
通过在广义 ufunc 的签名中使用数值,可以指示给定函数要求输入或输出具有给定大小的维度。例如,将极坐标角转换为二维笛卡尔单位向量的函数的签名将是()->(2)
;将两个球面角转换为三维单位向量的函数的签名将是(),()->(3)
;两个三维向量的叉乘的函数的签名将是(3),(3)->(3)
。
请注意,对于基本函数来说,这些维度与以字母开头的名称指示的变量维度没有任何区别;循环仍然传递相应的大小,但现在可以确信这个大小等于签名中给定的固定大小。
广义 ufunc 签名现在允许灵活的维度
一些函数,特别是 numpy 对@
的实现作为matmul
,非常类似于广义 ufunc,因为它们在核心维度上运算,但不能将它们呈现为这样,因为它们能够处理缺少维度的输入。为了支持这一点,现在允许在维度名称后加上一个问号,表示该维度不一定要存在。
加上这个附加功能后,matmul
的签名可以表示为(m?,n),(n,p?)->(m?,p?)
。这表示,例如,第二个操作数只有一个维度,对于基本函数来说,它将被视为输入具有核心形状(n, 1)
,输出具有相应的核心形状(m, 1)
。然而,实际输出数组将去掉灵活的维度,即它将具有形状(..., m)
。类似地,如果两个参数只有一个维度,那么输入将被呈现为具有形状(1, n)
和(n, 1)
到基本函数,并且输出为(1, 1)
,而实际输出数组将具有形状()
。通过这种方式,这个签名允许一个单一的基本函数用于四个相关但不同的签名,(m,n),(n,p)->(m,p)
,(n),(n,p)->(p)
,(m,n),(n)->(m)
和(n),(n)->()
。
np.clip
和clip
方法检查内存重叠
这些函数的out
参数现在总是测试内存重叠,以避免当内存重叠发生时出现损坏的结果。
选项np.polyfit
中的cov
的新值unscaled
np.polyfit
函数的cov
参数已添加了一个可能的值。使用cov='unscaled'
完全禁用了协方差矩阵的缩放(类似于在scipy.optimize.curve_fit
中设置absolute_sigma=True
)。这在权重由 1/sigma 给出的情况下很有用,其中 sigma 是(已知的)数据点的(高斯分布的)标准误差,此时未缩放的矩阵已经是协方差矩阵的正确估计。
标量数值类型的详细文档字符串
当应用于诸如numpy.intc
,numpy.int_
和numpy.longlong
之类的数值类型时,help
函数现在列出了该类型的所有别名,区分了依赖于平台的和独立的别名。
__module__
属性现在指向公共模块
大多数 NumPy 函数的__module__
属性已更新,以指向首选的公共模块,用于访问函数,而不仅仅是在定义函数的模块中。这为诸如 IPython 之类的工具中的函数提供了更多信息,例如,现在您看到的是<function 'numpy.sum'>
,而不是<function 'numpy.core.fromnumeric.sum'>
。
标记为适用于透明大页的大内存分配
在支持通过 madvise 系统调用透明大页的系统上,numpy 现在标记大内存分配可以由大页支持,这降低了页面错误开销,在一些高错误率的情况下可以显着提高性能。在 Linux 上,用于使用大页的设置,/sys/kernel/mm/transparent_hugepage/enabled,必须至少是madvise。已经将其设置为always的系统不会看到太大的区别,因为内核将在适当的情况下自动使用大页。
使用非常老旧的 Linux 内核(~3.x 及更旧)的用户应确保/sys/kernel/mm/transparent_hugepage/defrag未设置为always,以避免由内存碎片整理的并发问题导致的性能问题。
Alpine Linux(和其他 musl c 库发行版)支持
我们现在默认使用fenv.h来报告浮点状态错误。以前,我们有一个损坏的默认值,有时无法报告下溢,溢出和无效的浮点操作。现在我们可以支持像 Alpine Linux 这样的非 glibc 发行版,只要它们提供fenv.h。
为大型数组加速np.block
大型数组(大于512 * 512
)现在使用基于将数据直接复制到结果数组的适当切片的分块算法。这对于这些大型数组,特别是沿着超过 2 个维度进行分块的数组,导致了显着的加速。
arr.ctypes.data_as(...)
保持对 arr 的引用
以前调用者需要确保数组在指针的生命周期内保持存活。
arr.ctypes.data_as(...)
保留对 arr 的引用
以前调用者需要确保数组在指针的生命周期内保持存活。
加速了只读数组的np.take
当其writeable
标志设置为False
时,np.take
的实现不再对源数组进行不必要的复制。
为更多函数支持类似路径的对象
np.core.records.fromfile
函数现在还支持pathlib.Path
和其他类似路径的对象,而不仅仅是文件对象。此外,当使用内存映射(mmap_mode
关键字参数)时,np.load
函数现在也支持类似路径的对象。
在缩减期间 ufunc 身份的更好行为
通用函数具有在空轴上调用.reduce
时使用的.identity
。
从此版本开始,逻辑二进制 ufuncs,logical_and、logical_or和logical_xor,现在类型为bool的identity
,以前它们的类型是int。这恢复了 1.14 版的行为,在使用这些 ufuncs 缩减空对象数组时得到bool,同时保持了 1.15 版使用算术 ufuncs 如add
和multiply
在缩减空对象数组时得到int的行为。
此外,logaddexp 现在具有-inf
的身份,允许在空序列上调用它,以前是不可行的。
这得益于新的PyUFunc_FromFuncAndDataAndSignatureAndIdentity
,现在允许任意值作为身份使用。
改进了从 ctypes 对象进行的转换
Numpy 一直支持从ctypes
获取值或类型并将其转换为数组或 dtype,但只对更简单的类型行为正确。从此版本开始,这个警告已经解除 - 现在:
-
ctypes.Structure
的_pack_
属性,用于模拟 C 的__attribute__((packed))
,现在得到尊重。 -
保留了所有 ctypes 对象的字节顺序
-
支持
ctypes.Union
-
不可表示的结构会引发异常,而不是产生危险的不正确结果:
-
位域不再被解释为子数组
-
指针不再被指向的类型替换
-
新的ndpointer.contents
成员
这与普通 ctypes 数组的.contents
成员相匹配,并且可以用于构造指针内容的np.array
。这取代了在 1.15 版中停止工作的np.array(some_nd_pointer)
。由于此更改的副作用,ndpointer
现在支持具有重叠字段和填充的 dtype。
matmul
现在是一个ufunc
numpy.matmul
现在是一个 ufunc,这意味着现在可以通过__array_ufunc__
重载该函数和__matmul__
运算符。它的实现也已经更改。它使用与numpy.dot
相同的 BLAS 例程,确保其在大矩阵上的性能相似。
linspace
、logspace
和geomspace
的开始和结束数组
这些函数以前只限于标量的停止和起始值,但现在可以接受数组,这些数组将被妥善广播,并且结果将具有一个附加的轴。这可以用于在一组点之间获得线性插值点,例如。
CI 通过额外的服务进行了扩展
现在我们使用了额外的免费 CI 服务,感谢这些公司提供:
-
通过 codecov.io 进行代码覆盖测试
-
通过 shippable.com 进行 Arm 测试
-
在 azure pipelines 上进行了额外的测试运行
除了我们继续使用 travis、appveyor(用于 wheels)和 LGTM 外
更改
比较 ufunc 错误而不返回 NotImplemented
以前,比较 ufunc(例如np.equal
)如果它们的参数具有结构化 dtype,将返回NotImplemented,以帮助比较运算符(如__eq__
)处理它们。这不再需要,因为相关逻辑已经移至比较运算符本身(因此它们在需要时仍然会返回NotImplemented)。因此,像所有其他 ufunc 一样,比较 ufunc 现在将在结构化 dtype 上出错。
对非数值数组使用 Positive
现在会引发弃用警告
以前,+array
无条件返回一个副本。现在,如果数组不是数值的(即,如果np.positive(array)
引发TypeError
),它将引发一个DeprecationWarning
。对于重载了默认__array_ufunc__
实现的ndarray
子类,TypeError
会传递下去。
NDArrayOperatorsMixin
现在实现了矩阵乘法
以前,np.lib.mixins.NDArrayOperatorsMixin
没有实现 Python 矩阵乘法运算符(@
)的特殊方法。现在使用matmul
是一种 ufunc,并且可以通过__array_ufunc__
进行重载。
np.polyfit
中协方差矩阵的缩放不同了
到目前为止,np.polyfit
在协方差矩阵的缩放中使用了一个非标准的因子。换句话说,它不是使用标准的chisq/(M-N)
,而是用chisq/(M-N-2)
进行了缩放,其中 M 是数据点的数量,N 是参数的数量。这种缩放与其他拟合程序不一致,例如scipy.optimize.curve_fit
,因此已经更改为chisq/(M-N)
。
maximum
和 minimum
不再发出警告
作为 1.10 版本引入的代码的一部分,当在numpy.maximum
和numpy.minimum
中遇到 NaN 时,float32
和float64
将设置无效的浮点状态,使用 SSE2 语义。这有时会引发RuntimeWarning。在 1.15 版本中,我们修复了导致警告变得更加显眼的不一致性。现在不会再有警告出现了。
Umath 和 multiarray C 扩展模块合并为一个单一模块
根据NEP 15,这两个模块合并了。以前的np.core.umath和np.core.multiarray是独立的 C 扩展模块。它们现在是单一np.core/_multiarray_math C 扩展模块的 Python 包装器。
getfield
有效性检查进行了扩展
numpy.ndarray.getfield
现在检查 dtype 和 offset 参数,以防止访问无效的内存位置。
NumPy 函数现在支持用__array_function__
重写
NumPy 现在有一个新的实验性机制,通过在非 NumPy 数组上定义一个__array_function__
方法来覆盖几乎所有 NumPy 函数的实现,详见NEP 18。
这个特性尚未默认启用,但已发布以促进潜在用户的实验。有关设置适当环境变量的详细信息,请参阅 NEP。我们预计 NumPy 1.17 版本将默认启用覆盖,由于新的 C 语言实现,这也将更高效。
基于只读缓冲区的数组不能设置为可写(writeable)
现在,不允许在从fromstring(readonly-buffer)
创建的数组上将writeable
标志设置为 True。
比较 ufuncs 现在会出错而不是返回 NotImplemented
以前,诸如np.equal
的比较 ufunc 会在它们的参数具有结构化 dtype 时返回NotImplemented,以帮助比较运算符(如__eq__
)处理这些情况。这不再需要,因为相关逻辑已移至比较运算符本身(因此,在需要时仍会返回NotImplemented)。因此,与所有其他 ufunc 一样,比较 ufunc 现在将在结构化 dtype 上出错。
正数现在将为非数值数组引发弃用警告
以前,+array
会无条件返回一个副本。现在,如果数组不是数值(即,如果np.positive(array)
引发了一个TypeError
,它将引发一个DeprecationWarning
。对于覆盖了默认__array_ufunc__
实现的ndarray
子类,TypeError
将传递下去。
NDArrayOperatorsMixin
现在实现了矩阵乘法
以前,np.lib.mixins.NDArrayOperatorsMixin
没有实现 Python 的矩阵乘法运算符(@
)的特殊方法。现在matmul
是一个 ufunc,并且可以使用__array_ufunc__
来重写。
np.polyfit
中协方差矩阵的缩放不同了
到目前为止,np.polyfit
在协方差矩阵的缩放上使用了非标准因子。即,它不是用标准的chisq/(M-N)
,而是用chisq/(M-N-2)
来缩放,其中 M 是数据点的数量,N 是参数的数量。这种缩放与其他拟合程序(例如scipy.optimize.curve_fit
等)不一致,已更改为chisq/(M-N)
。
maximum
和minimum
不再发出警告
作为 1.10 版本中引入的代码的一部分,当使用 SSE2 语义时,在numpy.maximum
和numpy.minimum
中,遇到 Nan 时,在float32
和float64
中设置了无效的浮点状态。这有时会导致RuntimeWarning被发出。在 1.15 版本中,我们修复了导致警告变得更加引人注目的不一致性。现在不会发出任何警告。
Umath 和 multiarray c 扩展模块合并为一个单一模块
这两个模块已经合并,详见NEP 15。以前np.core.umath和np.core.multiarray是单独的 c 扩展模块。它们现在是单一np.core/_multiarray_math c 扩展模块的 Python 封装。
getfield
有效性检查已扩展
numpy.ndarray.getfield
现在检查 dtype 和 offset 参数,以防止访问无效的内存位置。
NumPy 函数现在支持使用__array_function__
进行重写
NumPy 有一个新的试验性机制,可以通过定义__array_function__
方法来覆盖几乎所有非 NumPy 数组上的 NumPy 函数的实现,详见 NEP 18。
这个特性目前还没有默认启用,但已发布以方便潜在用户进行实验。请参阅 NEP 以了解如何设置适当的环境变量。我们预计 NumPy 1.17 版本将默认启用重写,这也将因为采用了新的 C 语言实现而更具性能。
基于只读缓冲区的数组不能设置为writeable
现在禁止在由fromstring(readonly-buffer)
创建的数组上将writeable
标志设置为 True。
NumPy 1.15.4 发行说明
这是修复版本,用于修复 1.15.3 版本后报告的 bug 和回归问题。此版本支持的 Python 版本为 2.7, 3.4-3.7。wheels 已链接了 OpenBLAS v0.3.0,应该可以解决一些针对 NumPy 1.14 报告的线性代数问题。
兼容性说明
该 NumPy 1.15.x 版本的 OS X 轮已在 PyPI 上发布,不再包含 32 位二进制文件。未来版本也会如此。请查看有关讨论的相关内容,请参阅 #11625 。需要 32 位支持的用户应该到其他地方查找或从源代码构建。
贡献者
总共有 4 个人为这个版本作出了贡献。名称后面带有“+”符号的人第一次贡献了补丁。
-
Charles Harris
-
Matti Picus
-
Sebastian Berg
-
bbbbbbbbba +
合并的拉取请求
本次发布合并了总共 4 个拉取请求。
-
#12296: BUG: 释放缓存的缓冲区信息
-
#12297: BUG: 修复掩码数组中填充值的 ‘==’ 和 ‘!=’ 操作
-
#12307: DOC: 修正
numpy.einsum
中 optimize 的默认值 -
#12320: REL: 为 NumPy 1.15.4 版本做准备
兼容性说明
该 NumPy 1.15.x 版本的 OS X 轮已在 PyPI 上发布,不再包含 32 位二进制文件。未来版本也会如此。请查看有关讨论的相关内容,请参阅 #11625 。需要 32 位支持的用户应该到其他地方查找或从源代码构建。
贡献者
总共有 4 个人为这个版本作出了贡献。名称后面带有“+”符号的人第一次贡献了补丁。
-
Charles Harris
-
Matti Picus
-
Sebastian Berg
-
bbbbbbbbba +
合并的拉取请求
总共有 4 个拉取请求合并到了这个版本中。
-
#12296: BUG: 释放缓存的缓冲区信息
-
#12297: BUG: 修复掩码数组中填充值的 ‘==’ 和 ‘!=’ 操作
-
#12307: DOC: 修正
numpy.einsum
中 optimize 的默认值 -
#12320: REL: 为 NumPy 1.15.4 版本做准备
NumPy 1.15.3 版本发布说明
这是在 1.15.2 版本发布后报告的一些 bug 和回归的修复版本。此版本支持的 Python 版本为 2.7, 3.4-3.7。链接 OpenBLAS v0.3.0 应该能解决一些报告的 NumPy 1.14 中的 linalg 问题。
兼容性说明
NumPy 1.15.x 在 PyPI 上发布的 OS X 版本不再包含 32 位二进制文件。将在未来版本中也是如此。请查看 #11625 相关讨论。需要 32 位支持的人应该寻找其他资源或者自行编译。
贡献者
共有 7 人为这个版本做出了贡献。名字后带有“+”符号的人是第一次贡献补丁。
-
Allan Haldane
-
Charles Harris
-
Jeroen Demeyer
-
Kevin Sheppard
-
Matthew Bowden +
-
Matti Picus
-
Tyler Reddy
已合并的拉取请求
共有 12 个拉取请求被合并到了这个版本中。
-
#12080: MAINT: 加入了一些 MSVC 复杂函数到黑名单中。
-
#12083: TST: 为 1.15.x 分支添加 azure CI 测试。
-
#12084: BUG: test_path() 现在使用 Path.resolve()
-
#12085: TST, MAINT: 修复了 azure-pipelines mac 上一些测试失败的问题…
-
#12187: BUG: 修复 mapping.c 中的内存泄漏
-
#12188: BUG: 允许直方图中进行布尔减法
-
#12189: BUG: 修复原位置换
-
#12190: BUG: 将 get_num_build_jobs() 的默认限制调整为 8
-
#12191: BUG: OBJECT_to_* 应该检查是否有错误
-
#12192: DOC: 为 NumPy 1.15.3 版本发布做准备。
-
#12237: BUG: 修复 MaskedArray 填充值类型转换问题。
-
#12238: TST: 为 Mac 后备 azure-pipeline 测试修复
兼容性说明
NumPy 1.15.x 在 PyPI 上发布的 OS X 版本不再包含 32 位二进制文件。将在未来版本中也是如此。请查看 #11625 相关讨论。需要 32 位支持的人应该寻找其他资源或者自行编译。
贡献者
共有 7 人为这个版本做出了贡献。名字后带有“+”符号的人是第一次贡献补丁。
-
Allan Haldane
-
Charles Harris
-
Jeroen Demeyer
-
Kevin Sheppard
-
Matthew Bowden +
-
Matti Picus
-
Tyler Reddy
已合并的拉取请求
共有 12 个拉取请求被合并到了这个版本中。
-
#12080: MAINT: 加入了一些 MSVC 复杂函数到黑名单中。
-
#12083: TST: 向 1.15.x 分支添加 Azure CI 测试
-
#12084: BUG: test_path() 现在使用 Path.resolve()
-
#12085: TST, MAINT: 修复 azure-pipelines mac 上的一些失败测试
-
#12187: BUG: 修复 mapping.c 中的内存泄漏
-
#12188: BUG: 允许在直方图中进行布尔减法
-
#12189: BUG: 修复原地排列
-
#12190: BUG: 将 get_num_build_jobs() 的默认限制设置为 8
-
#12191: BUG: OBJECT_to_* 应该检查错误
-
#12192: DOC: 为 NumPy 1.15.3 版本的发布做准备
-
#12237: BUG: 修复 MaskedArray 的 fill_value 类型转换
-
#12238: TST: 为 Mac 的 azure-pipeline 测试修复补丁
NumPy 1.15.2 发布说明
这是针对 1.15.1 发布后报告的错误和回退的 bug 修复版本。
-
matrix PendingDeprecationWarning 现在在 pytest 3.8 中被抑制。
-
新的缓存分配机制已经修复,现在是线程安全的。
-
子类的布尔索引现在正确工作。
-
已修复 PyArray_AdaptFlexibleDType 中的一个小内存泄漏。
本次发布支持的 Python 版本为 2.7、3.4-3.7。这些安装包与 OpenBLAS v0.3.0 链接在一起,这应该可以解决一些 NumPy 1.14 中报告的线性代数问题。
兼容性说明
在 PyPI 发布的 NumPy 1.15.x OS X 安装包不再包含 32 位二进制文件。今后的发布也是如此。有需要 32 位支持的人应该寻找其他地方或者自行编译。
贡献者
共有 4 人贡献了本次发布。名字前带“+”的人第一次贡献了修补程序。
-
Charles Harris
-
Julian Taylor
-
Marten van Kerkwijk
-
Matti Picus
已合并的拉取请求
共有 4 个合并的拉取请求。
-
#11902:BUG:修复 pytest 中矩阵 PendingDeprecationWarning 的抑制…
-
#11981:BUG:为 1.15.x 修复不需要全局解释器锁(GIL)的缓存分配
-
#11982:BUG:修复 PyArray_AdaptFlexibleDType 中的引用计数泄漏
-
#11992:BUG:确保子类的布尔索引设置基类正确。
兼容性说明
在 PyPI 发布的 NumPy 1.15.x OS X 安装包不再包含 32 位二进制文件。今后的发布也是如此。有需要 32 位支持的人应该寻找其他地方或者自行编译。
贡献者
共有 4 人贡献了本次发布。名字前带“+”的人第一次贡献了修补程序。
-
Charles Harris
-
Julian Taylor
-
Marten van Kerkwijk
-
Matti Picus
已合并的拉取请求
本次发布共有 4 个合并的拉取请求。
-
#11902:BUG:修复 pytest 中矩阵 PendingDeprecationWarning 的抑制…
-
#11981:BUG:为 1.15.x 修复不需要全局解释器锁(GIL)的缓存分配
-
#11982:BUG:修复 PyArray_AdaptFlexibleDType 中的引用计数泄漏
-
#11992:BUG:确保子类的布尔索引设置基类正确。
NumPy 1.15.1 发布说明
这是一个针对 1.15.0 发布后报告的错误和回归的 bug 修复版本。
-
恼人但无害的 RuntimeWarning “numpy.dtype 大小已更改” 已被抑制。长期以来的抑制在过渡到 pytest 时丢失了。
-
对 Cython 0.28.3 的更新暴露了一个有问题的 gcc 属性的使用,用于在模块初始化时优先考虑代码大小而不是速度,可能导致编译代码不正确。这在最新的 Cython 中已经修复,但出于安全考虑在这里已被禁用。
-
改进了支持大端和 ARMv8 架构。
此版本支持的 Python 版本为 2.7、3.4-3.7。这些 wheel 连接了 OpenBLAS v0.3.0,应该可以解决 NumPy 1.14 中报告的一些线性代数问题。
兼容性说明
在 PyPI 上发布的 NumPy 1.15.x OS X 版 wheel 不再包含 32 位二进制文件。未来的版本也将是如此。有需要 32 位支持的人应该另寻他处或者自行构建。
贡献者
总共有 7 人为此次发布做出了贡献。带有“+”符号的人是第一次为补丁做出贡献。
-
Charles Harris
-
Chris Billington
-
Elliott Sales de Andrade +
-
Eric Wieser
-
Jeremy Manning +
-
Matti Picus
-
Ralf Gommers
合并的拉取请求
一共有 24 个拉取请求合并到了这个版本中。
-
#11647:MAINT:在
__init__.py
中过滤 Cython 警告 -
#11648:BUG:修复文档源链接以取消装饰器
-
#11657:BUG:确保在转换时不会删除单例维度...
-
#11661:BUG:在标量的最小值、最大值中警告 Nan
-
#11665:BUG:cython 有时会发出无效的 gcc 属性
-
#11682:BUG:修复 void_getitem 中的回归
-
#11698:BUG:让 matrix_power 再次适用于对象数组。
-
#11700:BUG:在失败的 malloc 后添加缺失的 PyErr_NoMemory
-
#11719:BUG:修复大端系统上未定义的函数。
-
#11720:MAINT:使 einsum 优化默认为 False。
-
#11746:BUG:修复 Python 2 中 loadtxt 用于 bz2 文本文件的回归。
-
#11757:BUG:恢复使用 console_scripts。
-
#11758:BUG:修复 aarch64 和 s390x 的 Fortran 种类检测。
-
#11759:BUG:修复在 ppc64le 上 longdouble 的打印。
-
#11760: BUG: 修正 Python 2 中 unicode 字段名称的问题
-
#11761: BUG: 增加对 python 3.7 的必需 cython 版本
-
#11763: BUG:检查 _buffer_format_string 的返回值
-
#11775: MAINT: 使 assert_array_compare 更加通用。
-
#11776: TST:修复 urlopen 存根。
-
#11777: BUG:修正 intersect1d 中的回归。
-
#11779: BUG: 修正对平台字节顺序敏感的测试。
-
#11781: BUG:避免直方图中的有符号溢出
-
#11785: BUG:修正 datetime64、timedelta64 标量的 pickle 和 memoryview。
-
#11786: BUG: 废弃触发了段错误
兼容性注意
在 PyPI 上发布的 NumPy 1.15.x 的 OS X wheels 不再包含 32 位二进制文件。在未来的发布中也将如此。请参阅#11625以了解相关讨论。需要 32 位支持的人应该寻找其他地方或者从源代码进行构建。
贡献者
本次发布共有 7 位贡献者。名字后面带有“+”的人第一次贡献了一个补丁。
-
Charles Harris
-
Chris Billington
-
Elliott Sales de Andrade +
-
Eric Wieser
-
Jeremy Manning +
-
Matti Picus
-
Ralf Gommers
合并的拉取请求
本次发布共合并了 24 个拉取请求。
-
#11647: MAINT: 在
__init__.py
中过滤 Cython 警告 -
#11648: BUG:修正 doc 源链接以取消装饰器
-
#11657: BUG: 确保在转换时不会丢弃单例维度…
-
#11661: BUG: scalar 的 minimum,maximum 中的 Nan 警告。
-
#11665: BUG: 当转换时,Cython 有时会发出无效的 gcc 属性
-
#11682: BUG: 修正 void_getitem 中的回归
-
#11698: BUG:使 object 数组的 matrix_power 再次生效。
-
#11700: BUG:在失败的 malloc 后添加缺失的 PyErr_NoMemory
-
#11719: BUG: 修正 big-endian 系统中的未定义函数问题。
-
#11720: MAINT: 让 einsum 默认优化为 False。
-
#11746: BUG:修正 Python 2 中 loadtxt 对 bz2 文本文件的回归。
-
#11757: BUG:恢复使用console_scripts。
-
#11758: BUG:修正 aarch64 和 s390x 的 Fortran 种类检测。
-
#11759: BUG: 修复 ppc64le 平台下 longdouble 的打印问题。
-
#11760: BUG: 修复 Python 2 中 unicode 字段名称的问题。
-
#11761: BUG: 提高 Python 3.7 中 cython 版本的要求。
-
#11763: BUG: 检查 _buffer_format_string 的返回值。
-
#11775: MAINT: 使 assert_array_compare 更通用。
-
#11776: TST: 修复 urlopen 存根。
-
#11777: BUG: 修复 intersect1d 中的回归问题。
-
#11779: BUG: 修复对平台字节顺序敏感的测试问题。
-
#11781: BUG: 避免直方图中的有符号溢出。
-
#11785: BUG: 修复 datetime64、timedelta64 标量的 pickle 和 memoryview 问题。
-
#11786: BUG: 弃用触发段错误。
NumPy 1.15.0 发行说明
NumPy 1.15.0 是一个进行大量清理、许多旧功能弃用以及改进现有功能的特殊版本。请阅读下面的详细描述,以确定您是否受影响。
为了测试,我们已经切换到 pytest 作为不再维护的 nose 框架的替代品。老式的基于 nose 的接口仍对可能仍在使用它的下游项目保留。
这个版本支持的 Python 版本是 2.7、3.4-3.7. 这些版本的 wheels 链接使用了 OpenBLAS v0.3.0,可以修复 NumPy 1.14 报告的一些 linalg 问题。
亮点
-
NumPy 已经切换到 pytest 进行测试。
-
一个新的
numpy.printoptions
上下文管理器。 -
直方图功能的许多改进。
-
支持在 Python 2.7 中使用 Unicode 字段名称。
-
PyPy 的改进支持。
-
对
numpy.einsum
进行了修复和改进。
新添加的功能
-
numpy.gcd
和numpy.lcm
,用于计算最大公约数和最小公倍数。 -
numpy.ma.stack
,numpy.stack
数组连接功能的泛化形式。 -
numpy.quantile
函数,是percentile
的接口而不是百分之百 -
numpy.nanquantile
函数,是nanpercentile
的接口而不是百分之百 -
numpy.printoptions
,一个临时设置打印选项的上下文管理器,用于with
块的范围内:>>> with np.printoptions(precision=2): ... print(np.array([2.0]) / 3) [0.67]
-
numpy.histogram_bin_edges
函数,用于获取直方图使用的边缘,而无需计算直方图。 -
新添加了 C 函数 npy_get_floatstatus_barrier 和 npy_clear_floatstatus_barrier 来处理编译器优化改变操作顺序的问题。详情请见下文。
旧功能弃用
-
内置的
pickle
函数的别名已被弃用,而是采用了它们未别名化的pickle.<func>
名称:-
numpy.loads
-
numpy.core.numeric.load
-
numpy.core.numeric.loads
-
numpy.ma.loads, numpy.ma.dumps
-
numpy.ma.load, numpy.ma.dump - 当以字符串调用这些函数时,这些函数在 python 3 中已经失败了。
-
-
除了元组以外的任何多维索引都已被弃用。这意味着
ind = [slice(None), 0]; arr[ind]
中的索引列表应该改为一个元组,例如ind = [slice(None), 0]; arr[tuple(ind)]
或arr[(slice(None), 0)]
。这一变化是必要的,以避免在诸如arr[[[0, 1], [0, 1]]]
这样的表达式中产生歧义,它目前被解释为arr[array([0, 1]), array([0, 1])]
,但在将来将被解释为arr[array([[0, 1], [0, 1]])]
。 -
从以下子模块导入的内容已弃用,它们将在将来的某个日期被移除。
-
numpy.testing.utils
-
numpy.testing.decorators
-
numpy.testing.nosetester
-
numpy.testing.noseclasses
-
numpy.core.umath_tests
-
-
现在已经弃用给
numpy.sum
的生成器。这是未记录的行为,但有效。以前,它将计算生成器表达式的和。将来,它可能返回不同的结果。请改用np.sum(np.from_iter(generator))
或内置的 Pythonsum
。 -
C-API 的用户应在释放数组之前对任何带有
WRITEBACKIFCOPY
标志的数组调用PyArrayResolveWriteBackIfCopy
或PyArray_DiscardWritebackIfCopy
。如果需要但未使用这些调用,将会发出弃用警告。 -
如果
nditer
的用户操作数中有一个可写的,则应始终将 nditer 对象用作上下文管理器,以便 numpy 可以管理写回语义,或者应调用it.close()
。否则在这些情况下可能会发出RuntimeWarning。 -
在 1.6.0 版本中很久以前已被弃用的
np.histogram
的normed
参数现在会产生DeprecationWarning
。
未来变更
-
NumPy 1.16 将不再支持 Python 3.4。
-
NumPy 1.17 将不再支持 Python 2.7。
兼容性说明
已重命名并私有化编译的测试模块
以下编译模块已重命名并私有化:
-
umath_tests
->_umath_tests
-
test_rational
->_rational_tests
-
multiarray_tests
->_multiarray_tests
-
struct_ufunc_test
->_struct_ufunc_tests
-
operand_flag_tests
->_operand_flag_tests
umath_tests
模块目前仍可供向后兼容使用,但将来将被移除。
由np.savez
返回的NpzFile
现在是一个collections.abc.Mapping
这意味着它的行为类似于只读字典,并且具有新的.values()
方法和len()
实现。
对于 Python 3,这意味着.iteritems()
,.iterkeys()
已被弃用,而.keys()
和.items()
现在返回视图而不是列表。这与内置的dict
类型在 Python 2 和 Python 3 之间的变化保持一致。
在某些条件下,必须在nditer
中使用上下文管理器
当使用一个numpy.nditer
且带有"writeonly"
或"readwrite"
标志时,存在一些情况下,nditer 实际上并没有给你一个可写数组的视图。相反,它会给你一个副本,如果你对副本进行更改,nditer 稍后会将这些更改写回实际的数组。目前,当数组对象被垃圾回收时,写回会发生,这使得这个 API 在 CPython 上容易出错,在 PyPy 上完全无法使用。因此,当nditer
与可写数组一起使用时,现在应该将其作为上下文管理器进行使用,例如 with np.nditer(...) as it: ...
。对于无法使用上下文管理器的情况,例如在生成器表达式中,也可以显式调用it.close()
。
Numpy 已经转而使用 pytest 而不是 nose 进行测试。
上一个 nose 发布版本是在 2015 年 6 月的 1.3.7 版本,该工具的开发已结束,因此 NumPy 现在已经转而使用 pytest。以前由一些下游项目使用的旧装饰器和 nose 工具仍然可用,但不再维护。标准测试工具,如 assert_almost_equal
等,不受此更改的影响,除了 import_nose
和 raises
这些与 nose 相关的函数。这些函数不在 numpy 中使用,但为了向下兼容性而被保留。
Numpy 不再通过 __array_interface__
对 ctypes
进行修改。
以前 numpy 为所有整数类型从 ctypes
添加了 __array_interface__
属性。
np.ma.notmasked_contiguous
和 np.ma.flatnotmasked_contiguous
总是返回列表。
这是文档中记录的行为,但以前的结果可以是切片、None 或列表中的任何一个。
所有下游用户似乎都检查flatnotmasked_contiguous
的None
结果,并将其替换为[]
。这些调用者将像以前一样继续工作。
np.squeeze
恢复了不能处理 axis
参数的对象的旧行为。
在版本1.7.0
之前,numpy.squeeze
没有 axis
参数,并且默认情况下删除所有空轴。引入axis
参数使得可以选择性地挤压单个或多个空轴,但由于旧的 API 预期没有得到尊重,因为轴仍然可以从一个期望所有空轴被删除的对象中被选择性地移除(无声成功)。这种对旧行为的无声、选择性移除空轴已经得到修复,并恢复了旧的行为。
无结构 void 数组的 .item
方法现在返回一个字节对象。
.item
现在返回一个bytes
对象,而不是缓冲区或字节数组。这可能会影响曾假设返回值是可变的代码,而这不再是一个案例。
copy.copy
和 copy.deepcopy
不再将 masked
转变为一个数组。
由于np.ma.masked
是只读标量,复制应该是一个无操作。现在这些函数的行为与np.copy()
一致。
结构化数组的多字段索引仍将返回一个副本
结构化数组的多字段索引返回一个视图而不是副本的更改被推迟到了 1.16 版本。新增了一种名为numpy.lib.recfunctions.repack_fields
的方法,用于减轻这一变化的影响,可以用于编写兼容 numpy 1.15 和 1.16 的代码。有关如何更新代码以适应此未来变化的更多信息,请参阅user guide的“访问多个字段”部分。
C API 更改
新增函数npy_get_floatstatus_barrier
和 npy_clear_floatstatus_barrier
添加了函数npy_get_floatstatus_barrier
和npy_clear_floatstatus_barrier
,并应在npy_get_floatstatus
和npy_clear_status
函数的位置使用。优化编译器如 GCC 8.1 和 Clang 在 ufunc SIMD 函数中使用先前的函数时会重新排列操作的顺序,导致在运行我们想要检查其状态的操作之前检查了 floatstatus 标志。详见#10339。
对PyArray_GetDTypeTransferFunction
的变更
PyArray_GetDTypeTransferFunction
现在默认使用用户定义的copyswapn
/copyswap
来定义用户定义的 dtypes。如果这导致了显著的性能损失,请考虑实现copyswapn
以反映PyArray_GetStridedCopyFn
的实现。详见#10898。
新功能
为整数和对象类型新增了np.gcd
和np.lcm
ufuncs
这些分别计算最大公约数和最小公倍数。这些适用于所有的 numpy 整数类型,以及内置的任意精度Decimal
和long
类型。
支持 iOS 的跨平台构建
构建系统已修改以支持_PYTHON_HOST_PLATFORM
环境变量,当在一个平台上编译到另一个平台时,distutils
使用该变量。这使得可以为 iOS 目标编译 NumPy。
这只允许您一次为一个特定平台编译 NumPy。创建完全兼容 iOS 的 NumPy 软件包需要为 iOS 支持的 5 种架构(i386、x86_64、armv7、armv7s 和 arm64)进行编译,并将这 5 种已编译的产品组合成一个单一的“fat”二进制文件。
为np.intersect1d
添加了return_indices
关键字
新的关键字return_indices
返回与两个输入数组中的共同元素对应的索引。
np.quantile
和np.nanquantile
就像np.percentile
和np.nanpercentile
一样,但是接受[0, 1]之间的分位数,而不是[0, 100]之间的百分位数。np.percentile
现在只是np.quantile
的一个简单包装器,多出一步是除以 100。
构建系统
增加了对 64 位 RISC-V 架构的实验性支持。
改进
np.einsum
更新
在numpy
和opt_einsum之间同步了einsum
路径优化技术。特别是greedy路径在@jcmgray 的许多增强。已解决的问题的完整列表如下:
-
可以将任意内存传递到greedy路径。修复了 gh-11210 的问题。
-
greedy路径已更新,包含了更多的动态规划思想,防止了大量重复(和昂贵)的调用,以确定实际进行的对偶收缩。现在在几百个输入张量上只需几秒钟。对于矩阵乘积状态理论非常有用。
-
重新设计了广播点错误捕捉,找到在 gh-11218 gh-10352 更早一些的过程中。
-
增强了以前在can_dot功能中遗漏的一个边缘情况(gh-11308 的一部分)。
np.ufunc.reduce
和相关函数现在接受初始值
np.ufunc.reduce
,np.sum
,np.prod
,np.min
和np.max
现在都接受一个initial
关键字参数,指定起始值来进行缩减。
np.flip
可以在多个轴上操作
np.flip
现在可以在其axis
参数中接受 None,或 int 的元组。如果 axis 为 None,它将在所有轴上进行翻转。
histogram
和histogramdd
函数已移至np.lib.histograms
这些原始找到在np.lib.function_base
中。它们仍然在它们的未作用域的np.histogram(dd)
名称下可用,为了保持兼容性,也在np.lib.function_base.histogram(dd)
中添加了别名。
做from np.lib.function_base import *
的代码将需要使用新位置,并且将来考虑不再使用import *
。
当显式仓时,histogram
将接受 NaN 值
之前,在试图计算数据的有限范围时会失败。由于在显式给出箱子时范围被忽略,这个错误是不必要的。
注意,对 NaN 值调用histogram
仍然会引发典型的RuntimeWarning
,这与处理 NaN 值的工作方式一样,可以像往常一样使用errstate
来消除。
当显式给出 bin 边时,histogram
在日期时间类型上工作
日期、时间和时间差现在可以进行直方图化。边缘必须显式传递,并且尚未自动计算。
histogram
“自动”估计器处理有限变化更好
IQR 为 0 不再导致n_bins=1
,而是在这种情况下所选的箱子数量与数据大小有关。
*histogram*和
histogramdd`返回的边与数据的浮点类型匹配
当传递np.float16
,np.float32
或np.longdouble
数据时,返回的边现在是相同的 dtype。以前,只有在显式给出箱子时,histogram
才会返回相同类型,而不管输入是什么,histogram
都会产生float64
箱。
histogramdd
允许在部分轴上显式给出范围
numpy.histogramdd
的range
参数现在可以包含None
值,以指示应从数据计算对应轴的范围。以前,无法对每个轴指定这一点。
histogramdd
和histogram2d
的normed
参数已重命名
这些参数现在称为density
,这与histogram
一致。旧参数仍然有效,但应优先使用新名称。
np.r_
可以与 0d 数组一起使用,np.ma.mr_
可以与np.ma.masked
一起使用
将 0d 数组传递给r_和mr_连接辅助程序现在被当作长度为 1 的数组处理。以前,传递这些会引发错误。因此,numpy.ma.mr_
现在可以在masked
常量上正确工作。
np.ptp
接受keepdims
参数和扩展的轴元组
np.ptp
(峰-峰值)现在可以跨多个轴工作,就像np.max
和np.min
一样。
MaskedArray.astype
现在与ndarray.astype
完全相同
这意味着它接受所有相同的参数,使为 ndarray 编写的更多代码也能为 masked array 工作。
在编译时启用 AVX2/AVX512
编译时更改 simd.inc.src 以允许使用 AVX2 或 AVX512。以前,使用-march=native 编译 avx2(或 512)仍然会在 simd 函数的其余代码得到 AVX2 时使用 SSE 代码。
nan_to_num
在接收标量或 0d 输入时,总是返回标量
以前,对于整数标量输入,返回数组,这与浮点输入的行为以及一般 ufuncs 的行为不一致。对于所有类型的标量或 0d 输入,结果现在是一个标量。
np.flatnonzero
可用于 numpy-可转换类型
np.flatnonzero
现在使用np.ravel(a)
,而不是a.ravel()
,因此可以用于列表、元组等。
np.interp
返回的是 numpy 标量而不是内置标量
以前np.interp(0.5, [0, 1], [10, 20])
会返回一个float
,但现在返回np.float64
对象,这更接近其他函数的行为。
另外,不再支持np.interp(object_array_0d, ...)
的特殊情况,因为np.interp(object_array_nd)
从未得到支持。
由于这个更改,period
参数现在可以用于 0d 数组。
允许在 Python 2 中使用 unicode 类型的字段名称
以前的np.dtype([(u'name', float)])
在 Python 2 中会引发TypeError
,因为只允许字节串作为字段名称。现在,任何 unicode 字符串字段名称都将使用ascii
编解码器编码,失败时引发UnicodeEncodeError
。
此更改使得使用from __future__ import unicode_literals
编写 Python 2/3 兼容代码变得更容易,此前,这会导致 Python 2 中的字符串字面量字段名称引发 TypeError。
比较 ufuncs 接受dtype=object
,覆盖默认的bool
这允许符号类型的对象数组,它们覆盖了==
和其他操作符以返回表达式,与np.equal(a, b, dtype=object)
进行逐个元素比较。
sort
函数接受kind='stable'
。
直到现在,要对数据执行稳定排序,用户必须这样做:
>>> np.sort([5, 2, 6, 2, 1], kind='mergesort')
[1, 2, 2, 5, 6]
因为归并排序是 NumPy 中唯一可用的稳定排序算法。然而,使用kind='mergesort'
并不明确表明用户想要执行稳定排序,因此影响了可读性。
此改动允许用户指定kind='stable'
,从而澄清意图。
不要进行临时复制进行原地累加。
当 ufunc 执行累积时,它们不再进行临时复制,因为输入和输出之间存在重叠,即,在累积结果存储在其位置之前添加下一个被累积的元素,因此重叠是安全的。避免复制导致更快的执行。
linalg.matrix_power
现在可以处理矩阵的堆栈。
与linalg
中的其他函数一样,matrix_power
现在可以处理大于 2 维的数组,它们被视为矩阵的堆栈。作为改动的一部分,为了进一步改善一致性,第一个参数的名称已从M
改为a
,非方阵的异常已从ValueError
改为LinAlgError
。
random.permutation
在多维数组中的性能增加。
permutation
现在对所有输入数组维度都使用random.shuffle
中的快速路径。先前,快速路径只用于 1 维数组。
广义通用函数现在接受axes
、axis
和keepdims
参数。
通过传递一个axes
参数,可以控制广义 ufunc 作用的轴,这是一个特定轴索引的元组列表。例如,对于矩阵乘法适用的签名(i,j),(j,k)->(i,k)
,基本元素是二维矩阵,它们被认为存储在每个参数的最后两个轴中。相应的axes
关键字将是[(-2, -1), (-2, -1), (-2, -1)]
。如果要使用前导维度,可以传递[(0, 1), (0, 1), (0, 1)]
。
为了简化,对于操作在一维数组(向量)上的广义通用函数,接受单个整数而不是单个元组内的单元素,以及对所有输出都是标量的广义通用函数,(空)输出元组可以被省略。因此,对于对于内积适用的的签名(i),(i)->()
,可以传入axes=[0, 0]
以表示向量存储在两个输入参数的第一个维度中。
对于类似于缩减的广义通用函数的快捷方式,即对单个共享核心维度进行操作的函数,例如上面的内积示例,可以传递一个axis
参数。这等同于对具有该核心维度的所有参数使用相同条目的axes
(例如,对于上面的示例,axes=[(axis,), (axis,)]
)。
此外,对于具有相同核心维度数量的所有输入和没有核心维度的输出的广义 ufunc,可以传入keepdims
以在输出中保留大小为 1 的维度,从而允许正确地与原始输入进行广播。可以使用axes
控制额外维度的位置。例如,对于内积示例,keepdims=True, axes=[-2, -2, -2]
将作用于内积示例,keepdims=True, axis=-2
将作用于输入参数的倒数第二维,并在输出中保留一个大小为 1 的维度。
在 ppc 系统上,float128
值现在可以正确打印。
以前在 ppc 上打印float128
值存在错误,因为这些系统上的特殊双精度浮点格式没有被考虑。现在float128
以正确四舍五入和唯一性打印。
警告给 ppc 用户:如果使用float128
,并且glibc
版本<=2.23,应该升级glibc
,因为在 ppc 上,这些版本的glibc
的malloc
经常会对分配的内存进行错误对齐,这可能会导致使用float128
值时崩溃 numpy。
新的 np.take_along_axis
和 np.put_along_axis
函数。
当在多维数组上使用argsort
、argmin
、argmax
和argpartition
时,返回的数组很难用作索引。take_along_axis
提供了一种方便的方式来使用这些索引在数组中查找值,以便:
np.take_along_axis(a, np.argsort(a, axis=axis), axis=axis)
与:
np.sort(a, axis=axis)
np.put_along_axis
作为在数组中写入这些索引的双重操作。
亮点
-
NumPy 已经转换为 pytest 进行测试。
-
一个新的
numpy.printoptions
上下文管理器。 -
许多改进的直方图函数。
-
在 Python 2.7 中支持 Unicode 字段名称。
-
改进了对 PyPy 的支持。
-
对
numpy.einsum
的修复和改进。
新的函数
-
numpy.gcd
和numpy.lcm
,用于计算最大公约数和最小公倍数。 -
numpy.ma.stack
,将numpy.stack
的数组连接函数推广到掩模数组。 -
numpy.quantile
函数,是percentile
的接口,不含 100 的因子。 -
numpy.nanquantile
函数,是nanpercentile
的接口,不含 100 的因子。 -
numpy.printoptions
,一个临时设置打印选项的上下文管理器:>>> with np.printoptions(precision=2): ... print(np.array([2.0]) / 3) [0.67]
-
numpy.histogram_bin_edges
,用于获取直方图使用的箱子边缘而无需计算直方图的函数。 -
C 函数npy_get_floatstatus_barrier和npy_clear_floatstatus_barrier已添加以处理编译器优化改变操作顺序。详情请参见下文。
弃用
-
对内置
pickle
函数的别名已弃用,改用它们未别名化的pickle.<func>
名称:-
numpy.loads
-
numpy.core.numeric.load
-
numpy.core.numeric.loads
-
numpy.ma.loads, numpy.ma.dumps
-
numpy.ma.load, numpy.ma.dump - 这些函数在使用字符串调用时已在 Python 3 上失败。
-
-
除了元组以外的任何多维索引都已被弃用。这意味着在
ind = [slice(None), 0]; arr[ind]
中,索引列表应更改为元组,例如ind = [slice(None), 0]; arr[tuple(ind)]
或arr[(slice(None), 0)]
。为了避免表达式的歧义,这种改变是必要的,例如arr[[[0, 1], [0, 1]]]
,当前被解释为arr[array([0, 1]), array([0, 1])]
,将来将被解释为arr[array([[0, 1], [0, 1]])]
。 -
引自以下子模块的导入已被弃用,它们将在将来的某个日期被移除。
-
numpy.testing.utils
-
numpy.testing.decorators
-
numpy.testing.nosetester
-
numpy.testing.noseclasses
-
numpy.core.umath_tests
-
-
将生成器传递给
numpy.sum
现在已被弃用。这是未记录的行为,但是可行的。以前,它会计算生成器表达式的总和。将来,它可能返回不同的结果。请使用np.sum(np.from_iter(generator))
或内置的 Pythonsum
代替。 -
C-API 的用户应该在释放数组之前对任何带
WRITEBACKIFCOPY
标志的数组调用PyArrayResolveWriteBackIfCopy
或PyArray_DiscardWritebackIfCopy
,否则将发出弃用警告。 -
使用
nditer
的用户应该在任何可写的迭代器操作数之一上将 nditer 对象用作上下文管理器,以便 numpy 可以管理写回语义,或者应该调用it.close()
。否则,在这些情况下可能会产生RuntimeWarning。 -
np.histogram
的normed
参数,在 1.6.0 之前就已过时,现在会发出DeprecationWarning
。
未来更改
-
NumPy 1.16 将不再支持 Python 3.4。
-
NumPy 1.17 将不再支持 Python 2.7。
兼容性说明
已重命名并私有化的编译测试模块
以下已重命名并私有化编译模块:
-
umath_tests
->_umath_tests
-
test_rational
->_rational_tests
-
multiarray_tests
->_multiarray_tests
-
struct_ufunc_test
->_struct_ufunc_tests
-
operand_flag_tests
->_operand_flag_tests
umath_tests
模块仍可用于向后兼容,但将在将来删除。
np.savez
返回的NpzFile
现在是一个collections.abc.Mapping
。
这意味着它的行为类似只读字典,并且有一个新的.values()
方法和len()
实现。
对于 python 3,这意味着.iteritems()
、.iterkeys()
已经被弃用,而.keys()
和.items()
现在返回视图而不是列表。这与 python 2 和 python 3 之间的内置dict
类型的变化保持一致。
在某些情况下,必须使用nditer
作为上下文管理器。
使用带有"writeonly"
或"readwrite"
标志的numpy.nditer
时,存在一些情况,其中nditer
实际上不会给你一个可写数组的视图,而是给你一个副本,如果对副本进行更改,则nditer
稍后将这些更改写回到你的实际数组中。目前,当数组对象被垃圾回收时,会发生这种写回,这使得这种 API 在 CPython 上容易出错,在 PyPy 上完全不起作用。因此,每当与可写数组一起使用时,现在应该将nditer
用作上下文管理器,例如,with np.nditer(...) as it: ...
。在无法使用上下文管理器的情况下,您还可以显式调用it.close()
。
Numpy 已经开始使用 pytest 而不是 nose 进行测试。
最后一次的nose
发布版本是在 2015 年 6 月的 1.3.7,那个工具的开发已经结束,因此现在 NumPy 已经转而使用 pytest 进行测试。一些下游项目之前使用的旧装饰器和nose
工具仍然可用,但不再维护。标准测试工具assert_almost_equal
等都不会受到这一变化的影响,除了一些nose
特定的函数import_nose
和raises
。这些函数在 numpy 中并未被使用,但为了下游兼容性而保留。
Numpy 不再使用ctypes
对__array_interface__
进行修补。
之前,numpy 向所有来自ctypes
的整数类型添加了__array_interface__
属性。
np.ma.notmasked_contiguous
和np.ma.flatnotmasked_contiguous
总是返回列表。
这是文档化的行为,但之前结果可以是任何切片、None 或列表中的任何一个。
所有下游用户似乎都检查flatnotmasked_contiguous
的None
结果并将其替换为[]
。那些调用者将继续像以前一样工作。
np.squeeze
恢复了无法处理axis
参数的对象的旧行为。
在 1.7.0
版本之前,numpy.squeeze
没有 axis
参数,默认情况下会移除所有空轴。增加了 axis
参数使得可以选择性地挤压单个或多个空轴,但旧的 API 预期未被遵守,因为仍可以从期望移除所有空轴的对象中选择性地移除(静默成功)空轴。修复了旧行为并恢复了旧行为。
无结构的空数组的 .item
方法现在返回一个 bytes 对象
.item
现在返回一个 bytes
对象,而不是缓冲区或字节数组。这可能会影响假定返回值可变的代码,但现在不再是这种情况。
copy.copy
和 copy.deepcopy
不再将 masked
转换为数组
由于 np.ma.masked
是只读标量,复制操作应该是一个无操作。这些函数现在与 np.copy()
一致地行为。
对结构化数组进行多字段索引仍将返回一个副本
结构化数组的多字段索引返回视图而不是副本的变化推迟到 1.16 版。引入了一个新的方法 numpy.lib.recfunctions.repack_fields
来帮助缓解这一变化的影响,可以用来编写与 numpy 1.15 和 1.16 兼容的代码。有关如何更新代码以应对这种未来变化的更多信息,请参阅用户指南的“访问多个字段”部分。
编译测试模块已重命名并设为私有
下列编译模块已改名并设为私有:
-
umath_tests
->_umath_tests
-
test_rational
->_rational_tests
-
multiarray_tests
->_multiarray_tests
-
struct_ufunc_test
->_struct_ufunc_tests
-
operand_flag_tests
->_operand_flag_tests
umath_tests
模块仍可用于向后兼容性,但将来会被移除。
由 np.savez
返回的 NpzFile
现在是 collections.abc.Mapping
这意味着它的行为类似于只读字典,并具有新的 .values()
方法和 len()
实现。
对于 python 3,这意味着 .iteritems()
,.iterkeys()
已被弃用,而 .keys()
和 .items()
现在返回视图而不是列表。这与 python 2 和 python 3 之间的内置 dict
类型的变化保持一致。
在某些情况下,必须使用 nditer
在上下文管理器中
当使用numpy.nditer
时,使用"writeonly"
或"readwrite"
标志时,有些情况下 nditer 实际上并不会给你一个可写数组的视图。相反,它会给你一个副本,如果你对副本进行更改,nditer 稍后会将这些更改写回到你的实际数组中。当前,当数组对象被垃圾收集时会发生这种写回的行为,这使得这个 API 在 CPython 上容易出错,在 PyPy 上完全破解。因此,无论何时使用可写数组,都应该将nditer
作为上下文管理器使用,例如with np.nditer(...) as it: ...
。你还可以显式调用it.close()
,例如在生成器表达式中无法使用上下文管理器的情况下。
Numpy 已经开始使用 pytest 而不是 nose 进行测试
上一个 nose 版本是 2015 年 6 月的 1.3.7,该工具的开发已经结束,因此 NumPy 现在已经转而使用 pytest。以前某些下游项目使用的旧装饰器和 nose 工具仍然可用,但不会得到维护。标准的测试工具,如assert_almost_equal
等,不受此改变的影响,除了 nose 特有的函数import_nose
和raises
。这些函数不会在 numpy 中使用,但会保留以保持向下兼容性。
Numpy 不再使用 pytest 将ctypes
进行 monkey-patch
以前,numpy 将__array_interface__
属性添加到ctypes
的所有整数类型中。
np.ma.notmasked_contiguous
和np.ma.flatnotmasked_contiguous
总是返回列表
这是文档化的行为,但以前的结果可以是 slice、None 或 list 中的任何一个。
所有的下游用户似乎都会检查flatnotmasked_contiguous
的None
结果,并用[]
替换它。这些调用者将继续如之前一样工作。
np.squeeze
恢复了无法处理axis
参数的对象的旧行为
在1.7.0
版本之前,numpy.squeeze
没有axis
参数,默认情况下所有空轴都会被移除。加入了axis
参数使得可以选择性地挤压单个或多个空轴,但旧的 API 预期没有得到尊重,因为轴仍然可以被有选择性地移除(无声成功)从一个期望所有空轴被移除的对象中。为那些期望旧行为的对象静默、有选择性地删除已被修正,并恢复了旧的行为。
无结构的 void 数组的.item
方法现在返回一个 bytes 对象
.item
现在返回一个bytes
对象,而不是一个缓冲区或字节数组。这可能会影响假设返回值是可变的代码,但现在已经不是这种情况了。
copy.copy
和copy.deepcopy
不再将masked
转换为数组
由于np.ma.masked
是只读标量,复制应该是无操作。这些函数现在与np.copy()
行为一致。
结构化数组的多字段索引仍将返回副本
多字段索引结构化数组返回视图而不是副本的更改推迟到 1.16 版。引入了一个新方法numpy.lib.recfunctions.repack_fields
来帮助缓解这一变化的影响,可以用于编写兼容 numpy 1.15 和 1.16 的代码。有关如何更新代码以适应这一未来变化的更多信息,请参阅user guide中的“访问多个字段”部分。
C API 变动
新函数npy_get_floatstatus_barrier
和npy_clear_floatstatus_barrier
添加了函数npy_get_floatstatus_barrier
和npy_clear_floatstatus_barrier
,应在npy_get_floatstatus
和npy_clear_status
函数的位置使用。优化编译器如 GCC 8.1 和 Clang 在 ufunc SIMD 函数中使用之前的函数时重新排列操作的顺序,导致在运行我们想要检查状态的操作之前检查了 floatstatus 标志。参见#10339。
对PyArray_GetDTypeTransferFunction
的变更
PyArray_GetDTypeTransferFunction
现在默认使用用户定义的copyswapn
/ copyswap
来处理用户定义的数据类型。如果这导致显著的性能损失,请考虑实现copyswapn
来反映PyArray_GetStridedCopyFn
的实现。参见#10898。
新函数npy_get_floatstatus_barrier
和npy_clear_floatstatus_barrier
添加了函数npy_get_floatstatus_barrier
和npy_clear_floatstatus_barrier
,应在npy_get_floatstatus
和npy_clear_status
函数的位置使用。优化编译器如 GCC 8.1 和 Clang 在 ufunc SIMD 函数中使用之前的函数时重新排列操作的顺序,导致在运行我们想要检查状态的操作之前检查了 floatstatus 标志。参见#10339。
对PyArray_GetDTypeTransferFunction
的变更
PyArray_GetDTypeTransferFunction
现在默认使用用户定义的copyswapn
/ copyswap
来处理用户定义的数据类型。如果这导致显著的性能损失,请考虑实现copyswapn
来反映PyArray_GetStridedCopyFn
的实现。参见#10898。
新特性
为整数和对象类型添加了np.gcd
和np.lcm
ufuncs
这些函数分别计算最大公约数和最小公倍数。它们可以用于所有 numpy 整数类型,以及内置的任意精度Decimal
和long
类型。
支持 iOS 的跨平台构建
构建系统已经修改以支持_PYTHON_HOST_PLATFORM
环境变量,在distutils
编译一个平台用于另一个平台时使用。这样就可以将 NumPy 编译为 iOS 目标。
这只允许您一次仅为一个特定平台编译 NumPy。创建一个完全与 iOS 兼容的 NumPy 包需要为 iOS 支持的 5 种架构(i386、x86_64、armv7、armv7s 和 arm64)构建,并将这 5 个编译构建产品合并为一个“fat”二进制文件。
np.intersect1d
添加了return_indices
关键字
新关键字return_indices
返回与公共元素对应的两个输入数组的索引。
np.quantile
和np.nanquantile
像np.percentile
和np.nanpercentile
一样,但接受[0, 1]范围内的分位数,而不是[0, 100]范围内的百分位数。np.percentile
现在是对np.quantile
的一个简单包装,额外的一步是将结果除以 100。
构建系统
添加了对 64 位 RISC-V 架构的实验性支持。
为整数和对象类型添加了np.gcd
和np.lcm
ufuncs
这些计算最大公约数和最小公倍数。这些适用于所有的 numpy 整数类型,还有内置的任意精度Decimal
和long
类型。
支持 iOS 的跨平台构建
构建系统已经修改以支持_PYTHON_HOST_PLATFORM
环境变量,在distutils
编译一个平台用于另一个平台时使用。这样就可以将 NumPy 编译为 iOS 目标。
这只允许您一次仅为一个特定平台编译 NumPy。创建一个完全与 iOS 兼容的 NumPy 包需要为 iOS 支持的 5 种架构(i386、x86_64、armv7、armv7s 和 arm64)构建,并将这 5 个编译构建产品合并为一个“fat”二进制文件。
np.intersect1d
添加了return_indices
关键字
新关键字return_indices
返回与公共元素对应的两个输入数组的索引。
np.quantile
和np.nanquantile
像np.percentile
和np.nanpercentile
一样,但接受[0, 1]范围内的分位数,而不是[0, 100]范围内的百分位数。np.percentile
现在是对np.quantile
的一个简单包装,额外的一步是将结果除以 100。
构建系统
添加了对 64 位 RISC-V 架构的实验性支持。
改进
np.einsum
更新
在numpy
和opt_einsum之间同步了 einsum 路径优化技术。特别是greedy路径得到了@jcmgray 的许多增强。修复的问题的完整列表如下:
-
任意内存可以传递到greedy路径。修复 gh-11210。
-
greedy 路径已更新,包含了更多的动态规划思想,避免了大量重复(和昂贵)的调用,找出实际的对应进行压缩。现在对几百个输入张量只需几秒钟。对于矩阵乘积态理论很有用。
-
重新设计了在 gh-11218 gh-10352 中找到的广播点错误捕获,使其在过程中更早一些。
-
增强了先前遗漏一个边缘情况的can_dot功能(gh-11308 的一部分)。
np.ufunc.reduce
和相关函数现在接受初始值
np.ufunc.reduce
、np.sum
、np.prod
、np.min
和np.max
现在都接受一个initial
关键字参数,指定开始归约的值。
np.flip
可以操作多个轴
np.flip
现在可以在其axis
参数中接受 None 或 int 的元组。如果 axis 为 None,则会在所有轴上翻转。
histogram
和histogramdd
函数已经移动到np.lib.histograms
这些最初在np.lib.function_base
中发现。它们仍然以它们的非作用域名称np.histogram(dd)
的形式可用,并为了保持兼容性,在np.lib.function_base.histogram(dd)
下起别名。
执行from np.lib.function_base import *
的代码现在需要使用新位置,并且将来应该考虑不再使用import *
。
在明确给定箱子时,histogram
将接受 NaN 值
先前在计算数据的有限范围时会失败。由于在显式给定箱子时范围被忽略,所以这个错误是不必要的。
请注意,对 NaN 值调用histogram
继续引发典型的 nan 值警告,像通常一样,可以用errstate
来消除。
在给定明确的箱子边缘时,histogram
可以处理 datetime 类型
现在可以对日期、时间和时间增量进行直方图化。必须明确传递箱子边缘,目前不会自动计算。
“auto”估计器的histogram
更好地处理有限的方差
IQR 为 0 不再导致n_bins=1
,而在这种情况下所选择的箱子数量与数据大小有关。
*histogram*和
histogramdd`返回的边现在与数据的浮点类型匹配
当传递np.float16
、np.float32
或np.longdouble
数据时,返回的边现在是相同的数据类型。以前,只有当明确给出箱子时,histogram
才会返回相同类型,而无论输入是什么,histogram
都会产生float64
箱子。
histogramdd
允许在子轴的子集中给出明确的范围
numpy.histogramdd
的range
参数现在可以包含None
值,表示应从数据中计算相应轴的范围。以前,这不能按轴指定。
histogramdd
和histogram2d
的 normed 参数已被重命名
这些参数现在称为density
,这与histogram
一致。旧参数仍然有效,但应优先使用新名称。
np.r_
可以处理 0d 数组,np.ma.mr_
可以处理np.ma.masked
r_和mr_连接帮助器传递的 0d 数组现在会被视为长度为 1 的数组。以前,传递这些数组会导致错误。因此,numpy.ma.mr_
现在可以正确地在masked
常量上工作。
np.ptp
接受keepdims
参数和扩展的轴元组
np.ptp
(峰峰值)现在可以跨多个轴工作,就像np.max
和np.min
一样。
MaskedArray.astype
现在与ndarray.astype
相同
这意味着它接受所有相同的参数,使得为ndarray
编写的更多代码也适用于masked array
。
在编译时启用 AVX2/AVX512
更改 simd.inc.src 以在编译时允许使用 AVX2 或 AVX512。以前,使用-march=native 编译 avx2(或 512)时,simd 函数的其余部分仍会使用 SSE 代码。
当接收标量或 0d 输入时,nan_to_num
始终返回标量
以前,整数标量输入会返回数组,这与浮点输入的行为不一致,也与 ufuncs 的一般行为不一致。现在,对于所有类型的标量或 0d 输入,结果都是标量。
np.flatnonzero
适用于 numpy 可转换类型
np.flatnonzero
现在使用np.ravel(a)
而不是a.ravel()
,因此适用于列表,元组等。
np.interp
返回 numpy 标量,而不是内置标量
以前,np.interp(0.5, [0, 1], [10, 20])
将返回一个float
,但现在它返回一个np.float64
对象,更符合其他函数的行为。
此外,不再支持np.interp(object_array_0d, ...)
这种特殊情况,因为np.interp(object_array_nd)
从来都不支持。
由于此更改,period
参数现在可以用于 0d 数组。
允许 Python 2 中将 dtype 字段名称设置为 Unicode
以前,在 Python 2 中,np.dtype([(u'name', float)])
将引发TypeError
,因为字段名只允许字节字符串。现在,任何 Unicode 字符串字段名都将使用ascii
编码,即在失败时引发UnicodeEncodeError
。
这一变化使得使用from __future__ import unicode_literals
编写 Python 2/3 兼容代码更容易,而以前会导致 Python 2 中的字符串文字字段名称引发 TypeError。
比较 ufuncs 接受dtype=object
,重写默认的bool
这允许具有符号类型的对象数组,这些符号类型可以重写==
和其他运算符以返回表达式,并且可以通过np.equal(a, b, dtype=object)
逐元素进行比较。
sort
函数接受 kind='stable'
直到现在,要对数据进行稳定排序,用户必须执行:
>>> np.sort([5, 2, 6, 2, 1], kind='mergesort')
[1, 2, 2, 5, 6]
因为归并排序是 NumPy 中唯一可用的稳定排序算法。然而,根据 kind=’mergesort’并不能明确表示用户想要执行稳定排序,因此会影响可读性。
此更改允许用户指定 kind=’stable’,从而澄清意图。
不要为原地累积制作临时副本
当 ufunc 执行累积时,它们不再产生临时副本,因为输入和输出之间存在重叠,即,在累积结果存储在其位置之前添加下一个累积元素,因此重叠是安全的。避免副本会导致更快的执行。
linalg.matrix_power
现在可以处理矩阵的堆栈
与linalg
中的其他函数一样,matrix_power
现在可以处理维数大于 2 的数组,这些数组被视为矩阵的堆栈。作为改变的一部分,为了进一步提高一致性,第一个参数的名称已更改为a
(从M
),并且非方阵的异常已更改为LinAlgError
(从ValueError
)。
提高了多维数组的random.permutation
性能
permutation
对所有输入数组维度使用random.shuffle
中的快速路径。以前只对 1 维数组使用快速路径。
广义 ufunc 现在接受axes
,axis
和keepdims
参数
通过传入axes
参数(带有特定轴索引的元组列表),可以控制广义 ufunc 操作的轴。例如,对于适用于矩阵乘法的签名(i,j),(j,k)->(i,k)
,基本元素是二维矩阵,这些被视为存储在每个参数的最后两个轴中。相应的 axes 关键字将是[(-2, -1), (-2, -1), (-2, -1)]
。如果想要使用前导维度,可以传入[(0, 1), (0, 1), (0, 1)]
。
对于简化起见,对于在一维数组(向量)上操作的广义 ufunc,可以接受一个整数而不是单个元组,对于所有输出都是标量的广义 ufunc,可以省略(空)输出元组。因此,对于适用于内积的签名(i),(i)->()
,可以传递axes=[0, 0]
以指示向量存储在两个输入参数的第一个维度中。
对于类似于缩减的广义 ufunc 的快捷方式,即对单个共享核心维度进行操作的广义 ufunc,例如上面的内积示例,可以传递axis
参数。这相当于对所有具有该核心维度的参数传递具有相同条目的axes
(例如,对于上面的示例,axes=[(axis,), (axis,)]
)。
此外,就像在缩减中一样,对于具有所有输入的广义 ufunc,这些输入都具有相同数量的核心维度和没有核心维度的输出,可以传递keepdims
以在输出中保留一个大小为 1 的维度,从而允许与原始输入进行正确广播。额外维度的位置可以通过axes
来控制。例如,对于内积示例,keepdims=True, axes=[-2, -2, -2]
将作用于内积示例,keepdims=True, axis=-2
将作用于输入参数的倒数第二维,并在输出中保留一个大小为 1 的维度。
现在在 ppc 系统上正确打印 float128 值
以前在 ppc 上打印 float128 值出现错误,因为这些系统上的特殊双倍浮点格式没有被考虑到。现在 float128 以正确的四舍五入和唯一性打印。
警告给 ppc 用户:如果使用的是版本 <=2.23 的 glibc,尤其是在使用 float128 的情况下,应该升级 glibc。在这些版本的 ppc 上,glibc 的 malloc 经常会对给定的内存做错误对齐,这可能会在使用 float128 值时导致 numpy 崩溃。
新的 np.take_along_axis
和 np.put_along_axis
函数
当在多维数组上使用 argsort
、argmin
、argmax
和 argpartition
时,返回的数组很难用作索引。take_along_axis
提供了一种简单的方法来使用这些索引来查找数组中的值,因此:
np.take_along_axis(a, np.argsort(a, axis=axis), axis=axis)
和下面的等价:
np.sort(a, axis=axis)
np.put_along_axis
充当在数组中写入这些索引的双向操作。
np.einsum
更新
在 numpy
和 opt_einsum 之间同步了 einsum 路径优化技术。特别是,greedy 路径由 @jcmgray 进行了许多增强。修复的问题列表如下:
-
现在可以将任意内存传递给 greedy 路径。修复了 gh-11210。
-
贪婪路径已更新,包含更多动态规划思想,避免了大量重复(和昂贵)的调用,以找出实际进行的对撞过程。现在在几百个输入张量上只需几秒钟。对于矩阵产品状态理论非常有用。
-
重新调整广播点错误捕捉,发现在 gh-11218 gh-10352 中稍早些阶段发生。
-
增强了 can_dot 功能,以前错过了一个边缘情况(部分属于 gh-11308)。
np.ufunc.reduce
和相关函数现在接受初始值
np.ufunc.reduce
、np.sum
、np.prod
、np.min
和 np.max
现在都接受一个 initial
关键字参数,指定开始缩减的值。
np.flip
可以在多个轴上操作
np.flip
现在可以在其 axis
参数中接受 None,或者 int 元组。如果 axis 为 None,则会在所有轴上翻转。
histogram
和 histogramdd
函数已移至 np.lib.histograms
这些最初在 np.lib.function_base
中找到。它们仍以其未作用域化的 np.histogram(dd)
名称可用,为了保持兼容性,在 np.lib.function_base.histogram(dd)
处取别名。
需要对执行 from np.lib.function_base import *
的代码进行更新,应考虑将来不使用 import *
。
当明确给定了区间时,histogram
将接受 NaN 值。
以前在尝试为数据计算有限范围时会失败。由于在明确定义了区间时范围会被忽略,这种错误是多余的。
请注意,在 NaN 值上调用 histogram
会继续引发与处理 nan 值相对应的 RuntimeWarning
,像往常一样,可以用 errstate
来消除这些警告。
当给定明确的 bin 边时,histogram
可以处理日期时间类型
现在可以对日期、时间和时间间隔进行直方图化。必须显式传递边缘,不会自动计算。
histogram
的 “auto” 估算器能更好地处理有限的方差
不再出现 IQR 为 0 时n_bins=1
的结果,而是在这种情况下所选的箱数与数据大小有关。
*histogram* 和
histogramdd` 返回的边现在与数据的浮点类型匹配
当传递 np.float16
,np.float32
或 np.longdouble
数据时,返回的边现在是相同的 dtype。以前,如果给定了显式的 bins,histogram
才会返回相同的类型,并且 histogram
无论输入是什么都会产生 float64
的 bins。
histogramdd
允许在轴的子集中给定显式范围
numpy.histogramdd
的 range
参数现在可以包含 None
值,以指示应从数据中计算对应轴的范围。以前无法在每轴基础上指定此参数。
histogramdd
和 histogram2d
的 normed 参数已被重命名
这些参数现在被称为 density
,这与 histogram
一致。旧参数仍然有效,但应首选使用新名称。
np.r_
可以使用 0 维数组,而 np.ma.mr_
可以使用 np.ma.masked
0d 数组传递给 r_ 和 mr_ 连接帮助程序现在被视为长度为 1 的数组。以前,传递这些数组会导致错误。结果上,numpy.ma.mr_
现在在 masked
常量上可以正确工作。
np.ptp
接受 keepdims
参数和扩展的轴元组
np.ptp
(peak-to-peak) 现在可以在多个轴上工作,就像 np.max
和 np.min
一样。
MaskedArray.astype
现在与 ndarray.astype
相同。
这意味着它接受与 ndarray 相同的所有参数,使得为 ndarray 编写的代码也适用于 masked array。
编译时启用 AVX2/AVX512
更改 simd.inc.src 以允许在编译时使用 AVX2 或 AVX512。以前,用 -march=native 编译的 avx2(或 512)仍会对 simd 函数使用 SSE 代码,即使其余代码已经使用 AVX2。
nan_to_num
在收到标量或 0 维输入时始终返回标量
以前对于整数标量输入会返回数组,这与浮点输入以及通用函数的行为是不一致的。现在对于所有类型的标量或 0 维输入,结果都是标量。
np.flatnonzero
可用于可转换为 numpy 类型
np.flatnonzero
现在使用 np.ravel(a)
而不是 a.ravel()
,所以它适用于列表、元组等。
np.interp
返回 numpy 标量而非内置标量
以前 np.interp(0.5, [0, 1], [10, 20])
将返回一个 float
,但现在它返回一个 np.float64
对象,这更符合其他函数的行为。
此外,不再支持np.interp(object_array_0d, ...)
的特殊情况,因为np.interp(object_array_nd)
本来就不被支持。
由于这一改变,period
参数现在可以用于 0 维数组。
允许 Python 2 中的 dtype 字段名称为 unicode。
先前,np.dtype([(u'name', float)])
会在 Python 2 中引发TypeError
,因为字段名称仅允许字节字符串。现在,任何 Unicode 字符串字段名称都将使用ascii
编解码器进行编码,在失败时引发UnicodeEncodeError
。
此更改使得可以更容易编写 Python 2/3 兼容的代码,使用from __future__ import unicode_literals
,之前会导致 Python 2 中的字符串字面量字段名称引发 TypeError。
比较 ufunc 接受dtype=object
,覆盖默认的bool
。
这允许具有符号类型的对象数组,这些类型覆盖了==
和其他运算符以返回表达式,与np.equal(a, b, dtype=object)
进行逐元素比较。
sort
函数接受kind='stable'
。
直到现在,要对数据执行稳定排序,用户必须执行以下操作:
>>> np.sort([5, 2, 6, 2, 1], kind='mergesort')
[1, 2, 2, 5, 6]
因为归并排序是 NumPy 中唯一可用的稳定排序算法。然而,使用kind='mergesort'
不能明确要求用户执行稳定排序,因此降低了可读性。
此更改允许用户指定kind='stable'
,从而澄清意图。
不要为就地累积进行临时复制
当 ufunc 执行累积时,不再创建临时副本,因为输入和输出之间存在重叠,即在累积结果存储在其位置之前,下一个元素进行累积。因此,重叠是安全的。避免复制可以加快执行速度。
linalg.matrix_power
现在可以处理矩阵的堆叠。
与linalg
中的其他函数一样,matrix_power
现在可以处理大于 2 维的数组,这些数组被视为矩阵的堆叠。作为改变的一部分,为了进一步提高一致性,第一个参数的名称已从M
更改为a
,并且非方阵的异常已从ValueError
更改为LinAlgError
。
提高了对多维数组的random.permutation
性能。
permutation
对所有输入数组维度使用random.shuffle
的快速路径。先前,快速路径仅用于 1 维数组。
广义 ufunc 现在接受axes
、axis
和keepdims
参数。
通过传入一个axes
参数,可以控制广义 ufunc 的操作轴,这个参数是一个具有特定轴索引的元组列表。例如,对于矩阵乘法的签名(i,j),(j,k)->(i,k)
,合适的基本元素是二维矩阵,并且它们被认为存储在每个参数的最后两个轴中。相应的axes
关键字将是[(-2, -1), (-2, -1), (-2, -1)]
。如果要使用前导维度,可以传入[(0, 1), (0, 1), (0, 1)]
。
为了简单起见,对于作用于一维数组(向量)的广义 ufunc,只需接受一个整数而不是单一元组,对于所有输出都是标量的广义 ufunc,可以省略输出元组的(空)内容。因此,对于一个适用于内积的签名(i),(i)->()
,可以传递 axes=[0, 0]
来指示向量存储在两个输入参数的第一个维度中。
作为类似于缩减的广义 ufunc 的快捷方式,即作用于单个共享核心维度的广义 ufunc(例如上面的内积示例),可以传递 axis
参数。这相当于对具有该核心维度的所有参数传递相同的 axes
条目(例如,对于上面的示例,axes=[(axis,), (axis,)]
)。
此外,就像对于缩减一样,对于具有相同核心维度数的输入和没有核心维度的输出的广义 ufunc,可以传递 keepdims
以在输出中保留大小为 1 的维度,从而允许正确地对原始输入进行广播。额外维度的位置可以用 axes
控制。例如,对于内积示例,keepdims=True, axes=[-2, -2, -2]
可以作用于内积示例,keepdims=True, axis=-2
可以作用于输入参数的倒数第二维,然后在输出中保留一个大小为 1 的维度。
float128 值现在在 ppc 系统上正常打印
以前在 ppc 上打印 float128 值存在错误,因为这些系统上的特殊双倍浮点格式没有被考虑。现在 float128 打印时会正确舍入并具有唯一性。
给 ppc 用户的警告:如果您使用 float128,应该升级 glibc,如果版本 <=2.23 尤其重要。在 ppc 上,这些版本中的 glibc malloc 经常会错误地对齐分配的内存,这可能会在使用 float128 值时导致 numpy 崩溃。
新的 np.take_along_axis
和 np.put_along_axis
函数
当在多维数组上使用时,argsort
、argmin
、argmax
和 argpartition
返回数组,这些数组很难用作索引。take_along_axis
提供了一种简单的方法,使用这些索引来查找数组中的值,比如:
np.take_along_axis(a, np.argsort(a, axis=axis), axis=axis)
和这个一样:
np.sort(a, axis=axis)
np.put_along_axis
作为数组中这些索引的写入双重操作。