NumPy-1-26-中文文档-二十六-
NumPy 1.26 中文文档(二十六)
NumPy 1.21.0 发行说明
NumPy 1.21.0 版本的亮点是
-
持续的 SIMD 工作,涵盖更多函数和平台,
-
新的 dtype 基础架构和类型转换的初步工作,
-
Python 3.8 和 Python 3.9 的通用 wheels 在 Mac 上可用,
-
改进了文档,
-
改进了注释,
-
新的
PCG64DXSM
位生成器用于随机数。
另外还有大量的错误修复和其他改进。
本版本支持的 Python 版本为 3.7-3.9。Python 3.10 发布后将添加官方支持。
警告
在使用 gcc-11.1 编译 NumPy 1.20.0 时存在未解决的问题。
-
优化级别 -O3 在运行测试时会产生许多不正确的警告。
-
在某些硬件上,NumPY 会陷入一个无限循环。
新函数
添加PCG64DXSM
BitGenerator
在大规模并行的上下文中使用PCG64
BitGenerator
已显示出统计弱点,这在 numpy 1.17 版本发布时并不明显。大多数用户永远不会观察到这种弱点,并且可以继续安全地使用PCG64
。 我们引入了一个新的PCG64DXSM
BitGenerator
,它将最终成为未来版本中default_rng
使用的新默认BitGenerator
实现。PCG64DXSM
解决了统计上的弱点,同时保留了PCG64
的性能和特征。
更多详细信息请参见 升级 PCG64 到 PCG64DXSM。
(gh-18906)
过时的弃用项
-
shape
参数unravel_index
不能再作为dims
关键字参数传递。(在 NumPy 1.16 版本中已弃用。)(gh-17900)
-
函数
PyUFunc_GenericFunction
已被禁用。 它在 NumPy 1.19 版本中已被弃用。用户应该直接使用 Python API 调用 ufunc。(gh-18697)
-
函数
PyUFunc_SetUsesArraysAsData
已被禁用。它在 NumPy 1.19 版本中已被弃用。(gh-18697)
-
类
PolyBase
已被移除(在 numpy 1.9.0 中弃用)。请改用抽象的ABCPolyBase
类。(gh-18963)
-
已删除未使用的
PolyError
和PolyDomainError
异常。(gh-18963)
弃用
.dtype
属性必须返回一个dtype
如果传递给np.dtype
或作为dtype=obj
参数的对象的.dtype
属性不是 dtype,则现在将发出DeprecationWarning
。 NumPy 将停止尝试递归地强制转换.dtype
的结果。
(gh-13578)
numpy.convolve
和numpy.correlate
的不完全匹配已弃用
convolve
和correlate
在函数中找到不区分大小写和/或不完全匹配的mode
参数时现在会发出警告。 对于mode
参数,传递完整的"same"
、"valid"
、"full"
字符串,而不是"s"
、"v"
、"f"
。
(gh-17492)
np.typeDict
现已正式弃用
np.typeDict
是np.sctypeDict
的已弃用别名,已经弃用了 14 年以上了(6689502)。获取np.typeDict
时将会发出弃用警告。
(gh-17586)
创建类似数组时将引发异常
当对象在访问特殊属性__array__
或__array_interface__
时引发异常时,通常会忽略此异常。 当异常不是 AttributeError 时,现在会发出警告。 要消除警告,必须调整引发异常的类型以引发AttributeError
。
(gh-19001)
四个ndarray.ctypes
方法已弃用
ndarray.ctypes
对象的四种方法已被弃用,因为它们是各自属性的(未记录的)实现工件。
有关的方法包括:
-
_ctypes.get_data
(使用_ctypes.data
代替) -
_ctypes.get_shape
(使用_ctypes.shape
代替) -
_ctypes.get_strides
(使用_ctypes.strides
代替) -
_ctypes.get_as_parameter
(使用_ctypes._as_parameter_
代替)
(gh-19031)
过期的弃用
-
shape
参数不能再作为dims
关键字参数传递给numpy.unravel_index
。 (在 NumPy 1.16 中已弃用。)(gh-17900)
-
函数
PyUFunc_GenericFunction
已被禁用。它在 NumPy 1.19 中已被弃用。用户应该直接使用 Python API 调用 ufunc。(gh-18697)
-
函数
PyUFunc_SetUsesArraysAsData
已被禁用。它在 NumPy 1.19 中已被弃用。(gh-18697)
删除已弃用的PolyBase
和未使用的PolyError
和PolyDomainError
类 PolyBase
已被移除(自 numpy 1.9.0 版本起废弃)。请改用抽象类 ABCPolyBase
。
此外, 从 numpy.polynomial
中删除了未使用的 PolyError
和 PolyDomainError
异常。
(gh-18963)
兼容性说明
通用函数中的错误类型变化
在某些情况下,通用函数现在可能会对非法输入抛出不同的错误。主要的改变是用更合适的 TypeError
替代了 RuntimeError
。当在同一调用中存在多个错误时,NumPy 现在可能会抛出不同的错误。
(gh-15271)
__array_ufunc__
参数验证
NumPy 现在会在调用 __array_ufunc__
之前部分验证参数。以前,当已知会进行派发时,可以传递无效的参数(例如不存在的关键字参数)。
(gh-15271)
__array_ufunc__
和其他位置参数
以前,所有位置传递的参数都会检查 __array_ufunc__
的支持。在 reduce
、accumulate
和 reduceat
的情况下,所有参数都可以通过位置传递。这意味着当它们通过位置传递时,它们以前可能已经被要求通过 __array_ufunc__
处理该通用函数调用。由于这取决于参数是通过位置还是通过关键字传递的方式,现在 NumPy 只会对输入和输出数组进行派发。例如,NumPy 永远不会对降维中的 where
数组进行派发,如 np.add.reduce
。
(gh-15271)
验证 Generator.uniform
的输入值
检查 np.random.Generator.uniform
中的 high - low >= 0
,如果 low > high
则引发 ValueError
。先前,无序输入是允许的,并且会静默交换,所以如果 low > high
,生成的值是 high + (low - high) * random()
。
(gh-17921)
默认包含路径中删除 /usr/include
使用numpy.distutils
构建包时,默认的包含路径不再包含/usr/include
。这条路径通常由编译器添加,硬编码可能会引起问题。如果这引起了问题,请提一个 issue。在 PR 18658 中有一个解决方法。
(gh-18658)
比较操作符 dtype=...
的变化
当比较通用函数(如 equal
、less
等)使用 dtype=
(或 signature
)参数时,将来这将表示所需的输出 dtype。这意味着:
np.equal(2, 3, dtype=object)
将来,如下情况下将会发出 FutureWarning
并返回一个 object
数组:
np.equal(None, None, dtype=object)
因为 np.array(None)
已经是一个对象数组,所以将返回一个 FutureWarning
。(对于其他一些 dtype 也是如此。)
由于比较通常只返回布尔数组,因此在将来提供任何其他 dtype 将始终引发错误,并现在会给出 DeprecationWarning
。
(gh-18718)
在 ufuncs 中对 dtype
和 signature
参数的更改
通用函数参数 dtype
和 signature
也适用于 np.add.reduce
等减少函数(它是 np.sum
的实现)在提供的 dtype
不是“基本”dtype 时现在会发出警告。
NumPy 几乎总是忽略这些输入的元数据、字节顺序或时间单位。现在,NumPy 将始终忽略它并在字节顺序或时间单位改变时引发错误。以下是将产生错误的最重要的更改示例。在某些情况下,先前存储的信息不被忽略,现在都会引发错误:
# Previously ignored the byte-order (affect if non-native)
np.add(3, 5, dtype=">i32")
# The biggest impact is for timedelta or datetimes:
arr = np.arange(10, dtype="m8[s]")
# The examples always ignored the time unit "ns":
np.add(arr, arr, dtype="m8[ns]")
np.maximum.reduce(arr, dtype="m8[ns]")
# The following previously did use "ns" (as opposed to `arr.dtype`)
np.add(3, 5, dtype="m8[ns]") # Now return generic time units
np.maximum(arr, arr, dtype="m8[ns]") # Now returns "s" (from `arr`)
对于像 np.sum
这样内部使用它们的函数也是如此。这个改变是为了在 NumPy 内部实现一致的处理。
如果你遇到了这些问题,在大多数情况下,例如通过 dtype=np.timedelta64
传递,这清楚地表示了一个没有任何单位或字节顺序定义的一般 timedelta64
。如果需要精确指定输出 dtype,则可以通过转换输入或使用out=来提供输出数组来执行。
在未来,NumPy 可能会选择允许在此处提供精确的输出 dtype
,这将在之前加上一个 FutureWarning
。
(gh-18718)
Ufunc signature=...
和 dtype=
的泛化和 casting
np.ufunc(1.0, 1.0, signature=...)
或 np.ufunc(1.0, 1.0, dtype=...)
的行为现在在 1.21 与 1.20 中可能会产生不同的循环,因为推广的变化。当先前使用 signature
时,对输入的强制转换检查被放宽了,这可能导致不安全地对输入进行降级,特别是如果与 casting="unsafe"
结合使用。
现在强制转换是安全的。如果只提供了部分签名,例如使用 signature=("float64", None, None)
,这可能导致找不到循环(错误)。在这种情况下,有必要提供完整的签名以强制转换输入。如果使用 dtype="float64"
或者只设置输出(例如 signature=(None, None, "float64")
),则不变。我们预计很少有用户会受到此更改的影响。
进一步地,dtype="float64"
的含义已经略有修改,现在严格地只强制正确的输出(而不是输入)DTypes。这意味着现在它总是等价于:
signature=(None, None, "float64")
(如果 ufunc 有两个输入和一个输出)。由于这可能导致在某些情况下找不到循环,因此 NumPy 通常也会搜索循环:
signature=("float64", "float64", "float64")
如果第一个搜索失败。在将来,可以定制此行为以实现更复杂的 ufunc 的预期结果。(对于某些通用函数,如 np.ldexp
输入可以有不同的 DTypes。)
(gh-18880)
Distutils 在 clang 上强制使用严格的浮点模型
当使用 clang 编译时,NumPy distutils 现在将始终添加-ffp-exception-behavior=strict
编译器标志。 Clang 默认为非严格版本,这允许编译器生成不正确设置浮点警告/错误的代码。
(gh-19049)
C API 变更
使用ufunc->type_resolver
和“类型元组”
NumPy 现在在调用类型解析器函数之前对“类型元组”参数进行规范化。 请注意,使用此类型解析器的行为是遗留行为,并且 NumPy 在可能的情况下不会执行此操作。 如果执行ufunc->type_resolver
或PyUFunc_DefaultTypeResolver
,则强烈不推荐,现在会规范化类型元组。 请注意,这不会影响提供类型解析器,预计在大多数情况下仍将继续工作。 如果您有意外使用类型解析器的情况,请通知 NumPy 开发人员,以便找到解决方案。
(gh-18718)
新功能
添加了一个 mypy 插件,用于处理特定平台的numpy.number
精度
现在提供了一个mypy插件,用于自动分配某些number
子类(包括int_
、intp
和longlong
)的(平台相关)精度。 查看关于标量类型的文档,全面了解受影响的类。
请注意,虽然插件的使用是完全可选的,但如果没有插件,则上述类的精度将被推断为Any
。
要启用插件,必须将其添加到 Mypy 的配置文件中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-17843)
让 mypy 插件管理扩展精度的numpy.number
子类
mypy插件,在 numpy/numpy#17843中引入,已扩展:插件现已删除不适用于相关平台的平台特定扩展精度类型的注释。 例如,当不可用时,将删除float128
。
没有插件all扩展精度类型将在 Mypy 看来,在所有平台上都可用。
要启用插件,必须将其添加到 Mypy 的配置文件中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-18322)
打印浮点值的新min_digits
参数。
对于 dragon4 浮点打印函数format_float_positional
和format_float_scientific
,添加了一个新的min_digits
参数。这个关键字确保在 unique=True 模式下打印时,至少会打印给定数量的数字,即使额外的数字对于唯一指定值是不必要的。它是 precision 参数的对应物,后者设置要打印的最大数字数量。在 fixed precision 模式下 unique=False,它没有效果,precision 参数固定数字数量。
(gh-18629)
f2py 现在可以识别 Fortran 抽象接口块了。
f2py
现在可以解析抽象接口块了。
(gh-18695)
通过环境变量配置 BLAS 和 LAPACK。
可以通过使用NPY_BLAS_LIBS
和NPY_LAPACK_LIBS
环境变量来绕过已安装的 BLAS 和 LAPACK 库的自动检测。相反,将直接使用这些环境变量中的链接标志,并假定语言为 F77。这在已知自动构建中确切已知已安装的 BLAS 和 LAPACK 时特别有用。一个用例是通过存根库链接在运行时替换实际实现。
如果设置了NPY_CBLAS_LIBS
(除了NPY_BLAS_LIBS
之外还是可选的),则会使用它,通过定义HAVE_CBLAS
并将环境变量内容附加到链接标志中。
(gh-18737)
ndarray
现在有一个可在运行时订阅的别名。
添加了numpy.typing.NDArray
,它是np.ndarray[Any, np.dtype[~Scalar]]
的运行时订阅别名。新的类型别名可用于注释具有给定 dtype 和未指定形状的数组。¹
¹截至 1.21 版本,NumPy 不支持数组形状的注释,但预计将来会有所改变(参见PEP 646)。
示例
>>> import numpy as np
>>> import numpy.typing as npt
>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]
>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)
>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
... return np.array(a)
(gh-18935)
改进
numpy.unwrap
的任意period
选项。
解包相位的间隔大小不再限制为2 * pi
。这对于解包度数特别有用,但也可用于其他间隔。
>>> phase_deg = np.mod(np.linspace(0,720,19), 360) - 180
>>> phase_deg
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180.])
>>> unwrap(phase_deg, period=360)
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
180., 220., 260., 300., 340., 380., 420., 460., 500.,
540.])
(gh-16987)
np.unique
现在返回单个NaN
当np.unique
在具有多个NaN
条目的数组上操作时,返回的数组包含每个在原始数组中为NaN
的条目的一个NaN
。现在改进为返回数组仅包含最后一个元素为NaN
的NaN
。
对于复数数组,所有 NaN
值都被视为等价(无论 NaN
是位于实部还是虚部)。作为返回数组的代表,被选择为字典顺序最小的值 - 请参考 np.sort
了解复数数组的字典顺序是如何定义的。
(gh-18070)
Generator.rayleigh
和 Generator.geometric
的性能得到了改进
Generator
中 Rayleigh 和几何随机变量生成的性能得到了改进。这两者都是指数随机变量的变换,慢速基于对数的反向 cdf 变换已被基于 Ziggurat 的指数变量生成器所取代。
此更改会在产生这两个分布的变量时打破生成的变量流。
(gh-18666)
替代品注释已得到改进
所有替代品注释,以前标记为 typing.Any
,已得到改进。在适当的情况下,它们已被明确的函数定义、类或其他杂项对象替换。
(gh-18934)
性能改进
改进了 NumPy 数组的整数除法性能
NumPy 数组的整数除法现在在除数为常数时使用 libdivide。通过使用 libdivide 和其他轻微优化,速度大大提升。//
运算符和 np.floor_divide
利用了这些新更改。
(gh-17727)
提高了 np.save
和 np.load
对于小数组的性能
对于小数组,np.save
现在速度更快。
对于小数组,np.load
速度也更快,但只在序列化版本 >= (3, 0)
时。
这两者是通过删除仅适用于 Python 2 的检查来完成的,同时仍然与可能由 Python 2 创建的数组保持兼容性。
(gh-18657)
更改
numpy.piecewise
输出类现在与输入类匹配
当输入到 piecewise
的 ndarray
子类被使用时,它们将被传递到这些函数中。输出现在也将是相同的子类。
(gh-18110)
启用 Accelerate 框架
随着 macOS 11.3 版本的发布,当使用加速框架的 BLAS 和 LAPACK 实现时,numpy 遇到的几种不同的问题应该得到解决。这个改变将在 macOS 上启用加速框架作为一个选项。如果发现其他问题,请使用开发者反馈助手工具(developer.apple.com/bug-reporting/
)提出 bug 报告。我们打算及时解决遇到的问题,并计划继续支持和更新我们的 BLAS 和 LAPACK 库。
(gh-18874)
新功能
添加 PCG64DXSM
BitGenerator
使用 PCG64
BitGenerator
在大规模并行环境中已经显示出统计上的问题,这些问题在 numpy 1.17 版本首次发布时并不明显。大多数用户永远也不会观察到这种弱点,可以继续安全地使用 PCG64
。我们引入了一个新的 PCG64DXSM
BitGenerator
,它最终将成为未来版本中 default_rng
使用的新默认 BitGenerator
实现。PCG64DXSM
解决了统计上的问题,同时保留了 PCG64
的性能和功能。
更多详情请参见 将 PCG64 升级为 PCG64DXSM 。
(gh-18906)
添加 PCG64DXSM
BitGenerator
使用 PCG64
BitGenerator
在大规模并行环境中已经显示出统计上的问题,这些问题在 numpy 1.17 版本首次发布时并不明显。大多数用户永远也不会观察到这种弱点,可以继续安全地使用 PCG64
。我们引入了一个新的 PCG64DXSM
BitGenerator
,它最终将成为未来版本中 default_rng
使用的新默认 BitGenerator
实现。PCG64DXSM
解决了统计上的问题,同时保留了 PCG64
的性能和功能。
更多详情请参见 将 PCG64 升级为 PCG64DXSM 。
(gh-18906)
过期的弃用标记
-
shape
参数unravel_index
不能再被作为dims
关键字参数传递。(在 NumPy 1.16 版本中被弃用。)(gh-17900)
-
函数
PyUFunc_GenericFunction
已被禁用。它在 NumPy 1.19 中已被弃用。用户应该直接使用 Python API 调用 ufunc。(gh-18697)
-
函数
PyUFunc_SetUsesArraysAsData
已被禁用。在 NumPy 1.19 中已被弃用。(gh-18697)
-
类
PolyBase
已被移除(在 numpy 1.9.0 中已被弃用)。请改用抽象类ABCPolyBase
。(gh-18963)
-
未使用的
PolyError
和PolyDomainError
异常被移除。(gh-18963)
弃用
.dtype
属性必须返回一个dtype
如果传递给np.dtype
或作为dtype=obj
参数的对象的.dtype
属性不是 dtype,则会发出DeprecationWarning
。NumPy 将停止尝试递归强制转换.dtype
的结果。
(gh-13578)
numpy.convolve
和numpy.correlate
的不精确匹配已被弃用
当函数中找到mode
参数不区分大小写和/或存在不精确匹配时,convolve
和correlate
现在会发出警告。对于mode
参数,传递完整的"same"
,"valid"
,"full"
字符串,而不是"s"
,"v"
,"f"
。
(gh-17492)
np.typeDict
已被正式弃用
np.typeDict
是np.sctypeDict
的弃用别名,并且已经是如此超过 14 年了(6689502)。现在获取np.typeDict
时将会发出弃用警告。
(gh-17586)
在类数组创建期间将会引发异常
当对象在访问特殊属性__array__
或__array_interface__
时引发异常时,通常会忽略该异常。现在,当异常不是 AttributeError 时会发出警告。要消除警告,引发异常的类型必须调整以引发AttributeError
。
(gh-19001)
四个ndarray.ctypes
方法已经被弃用
四个ndarray.ctypes
对象的方法已被弃用,因为它们是(未记录的)各自属性的实现产物。
相关的方法包括:
-
_ctypes.get_data
(请使用_ctypes.data
代替) -
_ctypes.get_shape
(请使用_ctypes.shape
代替) -
_ctypes.get_strides
(请使用_ctypes.strides
代替) -
_ctypes.get_as_parameter
(请使用_ctypes._as_parameter_
代替)
(gh-19031)
.dtype
属性必须返回一个dtype
如果传入np.dtype
或作为dtype=obj
参数的对象的.dtype
属性不是 dtype,则会发出DeprecationWarning
。NumPy 将停止尝试递归强制.dtype
的结果。
(gh-13578)
numpy.convolve
和numpy.correlate
的不精确匹配已经被弃用
当在函数中找到mode
参数的不精确匹配和/或忽略大小写时,convolve
和correlate
现在会发出警告。对mode
参数,应该传入完整的"same"
、"valid"
、"full"
字符串,而不是"s"
、"v"
、"f"
。
(gh-17492)
np.typeDict
已经正式弃用。
np.typeDict
是np.sctypeDict
的一个废弃别名,已经有 14 年之久(6689502)。现在在获取np.typeDict
时将发出弃用警告。
(gh-17586)
在创建类似数组时会发出异常
当一个对象在访问特殊属性__array__
或__array_interface__
时引发异常时,通常会忽略这个异常。现在,当异常不是 AttributeError 时,会发出警告。为了消除警告,引发异常的类型必须被适配为引发AttributeError
。
(gh-19001)
四个ndarray.ctypes
方法已被弃用
四个ndarray.ctypes
对象的方法已被弃用,因为它们是各自属性的(未记录的)实现工件。
受影响的方法有:
-
_ctypes.get_data
(使用_ctypes.data
代替) -
_ctypes.get_shape
(使用_ctypes.shape
代替) -
_ctypes.get_strides
(使用_ctypes.strides
代替) -
_ctypes.get_as_parameter
(使用_ctypes._as_parameter_
代替)
(gh-19031)
已过期的弃用标记
-
shape
参数numpy.unravel_index
现在不能再作为dims
关键字参数传递了(在 NumPy 1.16 中已被弃用)。(gh-17900)
-
函数
PyUFunc_GenericFunction
已被禁用。它在 NumPy 1.19 中已经被弃用。用户应该直接使用 Python API 调用 ufunc。(gh-18697)
-
函数
PyUFunc_SetUsesArraysAsData
已被禁用。它在 NumPy 1.19 中已经被弃用。(gh-18697)
删除了已弃用的PolyBase
和未使用的PolyError
和PolyDomainError
类PolyBase
已被移除(在 numpy 1.9.0 中已弃用)。请改用抽象的ABCPolyBase
类。
此外,从 numpy.polynomial
中移除了未使用的PolyError
和PolyDomainError
异常。
(gh-18963)
移除已弃用的PolyBase
和未使用的PolyError
和PolyDomainError
类PolyBase
已被移除(在 numpy 1.9.0 中已弃用)。请改用抽象的ABCPolyBase
类。
此外,从numpy.polynomial
中移除了未使用的PolyError
和PolyDomainError
异常。
(gh-18963)
兼容性注释
通用函数中的错误类型更改
通用功能现在在某些情况下可能对无效输入引发不同的错误。主要变化在于RuntimeError
被更合适的TypeError
所取代。当同一调用中存在多个错误时,NumPy 现在可能会引发不同的错误。
(gh-15271)
__array_ufunc__
参数验证
NumPy 现在将在调用__array_ufunc__
之前部分验证参数。以前,当已知将进行分发时,可能会传递无效参数(例如不存在的关键字参数)。
(gh-15271)
__array_ufunc__
和额外的位置参数
以前,所有位置传递的参数都会检查是否支持__array_ufunc__
。在reduce
,accumulate
和reduceat
的情况下,所有参数都可以按位置传递。这意味着当它们按位置传递时,它们以前可能已被要求通过__array_ufunc__
处理 ufunc 调用。由于这取决于参数的传递方式(按位置还是关键字传递),NumPy 现在只会在输入和输出数组上分发。例如,NumPy 永远不会在类似np.add.reduce
的缩减中分发到where
数组上。
(gh-15271)
验证Generator.uniform
中的输入值
检查np.random.Generator.uniform
中的high - low >= 0
。若low > high
,则引发ValueError
。以前,接受并悄悄交换顺序的输入,因此,若low > high
,生成的值为high + (low - high) * random()
。
(gh-17921)
从默认包含路径中删除/usr/include
使用numpy.distutils
构建包时,默认包含路径不再包括/usr/include
。此路径通常由编译器添加,硬编码它可能会出现问题。如果这造成问题,请提交一个问题。PR 18658 中有一个解决方法记录。
(gh-18658)
与dtype=...
比较的更改
当将比较 ufuncs(equal
、less
等)的dtype=
(或signature
)参数用于时,这将在将来表示所需的输出 dtype。这意味着:
np.equal(2, 3, dtype=object)
将在将来发出FutureWarning
,表示它将返回一个 object
数组,这目前发生在:
np.equal(None, None, dtype=object)
因为np.array(None)
已经是一个 object 数组。(对于一些其他 dtypes 也是一样。)
由于比较通常只返回布尔数组,在将来提供任何其他 dtype 将总是导致错误,并现在会发出 DeprecationWarning
。
(gh-18718)
ufuncs 中 dtype
和 signature
参数的更改
dtype
和 signature
这两个参数也适用于像 np.add.reduce
这样的缩减函数(它是 np.sum
的实现),现在当提供的dtype
不是“基本”dtype 时,会发出警告。
NumPy 几乎总是忽略这些输入的元数据、字节顺序或时间单位。现在 NumPy 将总是忽略并在字节顺序或时间单位发生变化时引发错误。以下是会导致错误的重要更改示例。在一些情况下,以前存储的信息不会被忽略,在所有这些情况下都会引发错误:
# Previously ignored the byte-order (affect if non-native)
np.add(3, 5, dtype=">i32")
# The biggest impact is for timedelta or datetimes:
arr = np.arange(10, dtype="m8[s]")
# The examples always ignored the time unit "ns":
np.add(arr, arr, dtype="m8[ns]")
np.maximum.reduce(arr, dtype="m8[ns]")
# The following previously did use "ns" (as opposed to `arr.dtype`)
np.add(3, 5, dtype="m8[ns]") # Now return generic time units
np.maximum(arr, arr, dtype="m8[ns]") # Now returns "s" (from `arr`)
对于像np.sum
这样在内部使用这些的函数也是一样。这个变化是为了在 NumPy 中实现一致的处理。
如果你遇到了这些情况,在大多数情况下,例如传递dtype=np.timedelta64
,它清晰地表示一个没有任何单位或字节顺序定义的通用timedelta64
。如果需要精确指定输出 dtype,可以通过转换输入或使用out= 来提供输出数组。
NumPy 可能选择允许在未来在这里提供一个精确的输出dtype
,这将先发出 FutureWarning
。
(gh-18718)
Ufunc signature=...
和 dtype=
的泛化和转换
np.ufunc(1.0, 1.0, signature=...)
或 np.ufunc(1.0, 1.0, dtype=...)
的行为现在在 1.21 中可能与 1.20 中不同,因为有关提升的改变。当先前使用signature
时,输入的强制检查被放宽,这可能导致不安全的进行输入向下转换,尤其是当与casting="unsafe"
结合使用时。
现在保证转换是安全的。如果只提供了部分签名,例如使用signature=("float64", None, None)
,这可能导致找不到循环(错误)。在这种情况下,必须提供完整的签名来强制转换输入。如果使用dtype="float64"
或者仅设置输出(例如signature=(None, None, "float64")
)则不会改变。我们预计很少有用户会受到这种改变的影响。
此外,dtype="float64"
的含义已经稍有修改,现在严格地只强制执行正确的输出(而不是输入) DTypes。这意味着现在它总是等价于:
signature=(None, None, "float64")
(如果 ufunc 有两个输入和一个输出)。由于这可能导致在某些情况下找不到循环,因此 NumPy 通常也会搜索循环:
signature=("float64", "float64", "float64")
如果第一次搜索失败。将来,这个行为可能可以定制化,以实现对更复杂的通用函数的期望结果。(对于一些通用函数,比如np.ldexp
,输入可能具有不同的 DTypes。)
(gh-18880)
Distutils 在 clang 上强制使用严格浮点模型
当使用 clang 编译时,NumPy distutils 现在将始终添加-ffp-exception-behavior=strict
编译器标志。Clang 的默认版本是非严格版本,允许编译器生成不正确设置浮点警告/错误的代码。
(gh-19049)
通用函数中错误类型的更改
在某些情况下,通用函数可能会对无效输入引发不同的错误。主要的改变应该是将RuntimeError
替换为更合适的TypeError
。当在同一次调用中出现多个错误时,NumPy 现在可能会引发不同的错误。
(gh-15271)
__array_ufunc__
参数验证
NumPy 现在会在调用__array_ufunc__
之前部分验证参数。以前,当已知要进行分派时,可能传递无效的参数(例如不存在的关键字参数)。
(gh-15271)
__array_ufunc__
和额外的位置参数
以前,所有按位置传递的参数都会检查__array_ufunc__
的支持。对于reduce
、accumulate
和reduceat
,所有参数都可以按位置传递。这意味着当它们被按位置传递时,它们以前可能被要求通过__array_ufunc__
处理 ufunc 调用。由于这取决于参数是按位置还是按关键字传递的方式,NumPy 现在只会对输入和输出数组进行分派。例如,在像np.add.reduce
这样的缩减中,NumPy 永远不会对where
数组进行分派。
(gh-15271)
在Generator.uniform
中验证输入值
在np.random.Generator.uniform
中验证了high - low >= 0
。如果low > high
,则引发ValueError
。以前,接受了无序输入并进行了悄悄交换,所以如果low > high
,生成的值是high + (low - high) * random()
。
(gh-17921)
默认包含路径中移除了/usr/include
使用numpy.distutils
构建包时,默认的包含路径不再包括/usr/include
。这个路径通常由编译器添加,硬编码它可能会有问题。如果这导致问题,请提出问题。在 PR 18658 中有一个解决方法。
(gh-18658)
对于dtype=...
的比较进行了更改
当用于比较 ufuncs(equal
, less
,等)的dtype=
(或signature
)参数时,这将在未来表示期望的输出 dtype。这意味着:
np.equal(2, 3, dtype=object)
在未来,将针对将要返回object
数组的情况发出FutureWarning
警告,目前已经发生在:
np.equal(None, None, dtype=object)
因为np.array(None)
已经是一个对象数组。(对于一些其他 dtype 也是如此)。
由于比较通常只返回布尔数组,未来提供任何其他 dtype 都会导致错误,并现在会发出DeprecationWarning
。
(gh-18718)
ufuncs 中dtype
和signature
参数的更改
通用函数参数dtype
和signature
,也适用于缩约,如np.add.reduce
(它是np.sum
的实现),当提供的dtype
不是“基本”dtype 时,现在会发出警告。
几乎总是忽略这些输入的元数据、字节顺序或时间单位。现在 NumPy 将始终忽略它,并在字节顺序或时间单位发生更改时引发错误。以下是可能导致错误的最重要的变化示例。在某些情况下,之前存储的信息未被忽略,在所有这些信息中现在都会引发错误:
# Previously ignored the byte-order (affect if non-native)
np.add(3, 5, dtype=">i32")
# The biggest impact is for timedelta or datetimes:
arr = np.arange(10, dtype="m8[s]")
# The examples always ignored the time unit "ns":
np.add(arr, arr, dtype="m8[ns]")
np.maximum.reduce(arr, dtype="m8[ns]")
# The following previously did use "ns" (as opposed to `arr.dtype`)
np.add(3, 5, dtype="m8[ns]") # Now return generic time units
np.maximum(arr, arr, dtype="m8[ns]") # Now returns "s" (from `arr`)
同样适用于像np.sum
这样在内部使用这些的函数。这种变化是为了在 NumPy 中实现一致的处理而必需的。
如果遇到这种情况,在大多数情况下,例如传递 dtype=np.timedelta64
,清楚指明一个没有定义单元或字节顺序的通用timedelta64
。如果需要精确指定输出 dtype,可以通过转换输入或使用out=提供输出数组来做到。
未来 NumPy 可能会选择在此提供确切的输出dtype
,这将先于FutureWarning
警告。
(gh-18718)
通用函数signature=...
和dtype=
的泛化以及casting
在 1.21 版本中,与 1.20 版本相比,对于np.ufunc(1.0, 1.0, signature=...)
或np.ufunc(1.0, 1.0, dtype=...)
可能产生不同的循环,因为提升发生了改变。之前使用signature
时,输入的强制转换检查会得到放松,这可能导致安全地向下转换输入,特别是与casting="unsafe"
一起使用时。
现在强制转换是安全的。如果仅部分提供了签名,例如使用signature=("float64",None,None)
,这可能导致找不到循环(错误)。在这种情况下,有必要提供完整的签名来强制转换输入。如果使用了dtype="float64"
或仅设置了输出(例如signature=(None,None,"float64")
),这是不变的。我们预计很少有用户会受到此更改的影响。
进一步,dtype="float64"
的含义已经稍微修改,现在严格执行正确的输出 DTypes。这意味着它现在总是等效于:
signature=(None, None, "float64")
(如果 ufunc 有两个输入和一个输出)。由于这在某些情况下可能导致找不到循环,NumPy 通常也会搜索循环:
signature=("float64", "float64", "float64")
如果第一次搜索失败。将来,可能会定制此行为以获得更复杂的 ufunc 的预期结果。(对于某些通用函数,例如 np.ldexp
,输入可以具有不同的数据类型。)
(gh-18880)
Distutils 强制在 clang 上使用严格的浮点模型
使用 clang 进行编译时,NumPy distutils 现在总会添加-ffp-exception-behavior=strict
编译器标志。Clang 默认使用非严格版本,允许编译器生成未正确设置浮点警告/错误的代码。
C API 更改
使用 ufunc->type_resolver
和“类型元组”
NumPy 现在在调用类型解析器函数之前将“类型元组”参数标准化。请注意,在使用这种类型解析器的情况是遗留行为,如果可能,NumPy 将不这样做。强烈不建议调用ufunc->type_resolver
或PyUFunc_DefaultTypeResolver
,如果这样做将强制执行标准化的类型元组。请注意,这不影响提供类型解析器,它预期在大多数情况下仍能工作。如果您对调用类型解析器有意外用例,请通知 NumPy 开发人员,以便找到解决方案。
(gh-18718)
使用 ufunc->type_resolver
和“类型元组”
NumPy 现在在调用类型解析器函数之前将“类型元组”参数标准化。请注意,在使用这种类型解析器的情况是遗留行为,如果可能,NumPy 将不这样做。强烈不建议调用ufunc->type_resolver
或PyUFunc_DefaultTypeResolver
,如果这样做将强制执行标准化的类型元组。请注意,这不影响提供类型解析器,它预期在大多数情况下仍能工作。如果您对调用类型解析器有意外用例,请通知 NumPy 开发人员,以便找到解决方案。
(gh-18718)
新功能
添加了一个用于处理平台特定 numpy.number
精度的 mypy 插件
现在可以使用 mypy 插件自动分配某些number
子类的(平台相关)精度,包括int_
、intp
和longlong
等。请参阅标量类型部分的文档,以全面了解受影响的类。
注意,尽管使用插件是完全可选的,但如果不使用它,则上述类的精度将被推断为Any
。
要启用插件,必须将其添加到他们的 mypy 配置文件 中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-17843)
让 mypy 插件来管理扩展精度的 numpy.number
子类
在 numpy/numpy#17843 中引入的 mypy 插件已经扩展:该插件现在会删除特定平台上不可用的特定扩展精度类型的注释。例如,在不可用时,它将删除 float128
。
没有插件的话,就会在 mypy 看来,所有的扩展精度类型在所有平台上都是可用的。
要启用插件,必须将其添加到他们的 mypy 配置文件 中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-18322)
打印浮点数值的新 min_digits
参数
dragon4
和 format_float_scientific
浮点打印函数中添加了一个新的 min_digits
参数。该关键字参数保证在 unique=True 模式下打印时,至少会打印给定数量的数字,即使这些额外的数字在唯一指定值时是不必要的。它是设置要打印的最大数字数量的精度参数的对应物。在 fixed precision 模式下,当 unique=False 时,它没有效果,精度参数固定数字的数量。
(gh-18629)
f2py 现在能够识别 Fortran 的抽象接口块了
f2py
现在可以解析抽象接口块。
(gh-18695)
通过环境变量配置 BLAS 和 LAPACK。
通过使用 NPY_BLAS_LIBS
和 NPY_LAPACK_LIBS
环境变量可以绕过已安装的 BLAS 和 LAPACK 库的自动检测。而是直接使用这些环境变量中的链接标志,并且假定语言为 F77。这在已知精确安装了哪些 BLAS 和 LAPACK 的自动化构建中特别有用。一个用例是通过存根库链接在运行时替换实际实现。
如果设置了 NPY_CBLAS_LIBS
(作为 NPY_BLAS_LIBS
的可选项),这也将被使用,通过定义 HAVE_CBLAS
并将环境变量内容附加到链接标志中。
(gh-18737)
添加了对ndarray
的运行时可订阅别名
已经添加了numpy.typing.NDArray
,它是np.ndarray[Any, np.dtype[~Scalar]]
的运行时可订阅别名。这个新类型别名可以用于注释具有给定 dtype 和未指定形状的数组。 ¹
¹截至 1.21 版本,NumPy 不支持数组形状的注释,但预计将来会有所改变(参见PEP 646)。
示例
>>> import numpy as np
>>> import numpy.typing as npt
>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]
>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)
>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
... return np.array(a)
(gh-18935)
添加了处理平台特定的numpy.number
精度的 mypy 插件
现在提供了一个mypy插件,用于自动分配某些number
子类的(平台相关的)精度,包括int_
、intp
和longlong
等类型。请参阅标量类型文档,了解受影响的类的全面概述。
注意,虽然使用插件完全是可选的,但如果不使用插件,上述类的精度将被推断为Any
。
要启用插件,必须将其添加到 mypy 的配置文件中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-17843)
让 mypy 插件管理扩展精度numpy.number
子类
在 numpy/numpy#17843 中引入的mypy插件已经扩展:该插件现在会删除平台特定的扩展精度类型的注释,这些类型对于相关平台是不可用的。例如,当不可用时,它会删除float128
。
没有这个插件,mypy 认为所有扩展精度类型在所有平台上都可用。
要启用插件,必须将其添加到 mypy 的配置文件中:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-18322)
为打印浮点值添加了新的min_digits
参数
dragon4
浮点打印函数 format_float_positional
和 format_float_scientific
添加了一个新的 min_digits
参数。这个参数在 unique=True 模式下打印时保证至少打印给定数量的数字,即使额外的数字对于唯一指定值是不必要的。它是将最大打印位数设置为精度参数的对应项。在 unique=False 的固定精度模式下,它没有效果,精度参数固定位数。
(gh-18629)
f2py
现在可以识别 Fortran 抽象接口块
f2py
现在可以解析抽象接口块。
(gh-18695)
通过环境变量配置 BLAS 和 LAPACK
通过使用 NPY_BLAS_LIBS
和 NPY_LAPACK_LIBS
环境变量,可以绕过对已安装的 BLAS 和 LAPACK 库的自动检测。相反,这些环境变量中的链接标志将直接使用,并且语言被假定为 F77。这在已明确知道已安装的 BLAS 和 LAPACK 的自动化构建中特别有用。一个使用案例是通过 stub 库链接在运行时替换实际实现。
如果设置了 NPY_CBLAS_LIBS
(除了 NPY_BLAS_LIBS
),则也将使用它,通过定义 HAVE_CBLAS
并将环境变量内容追加到链接标志中。
(gh-18737)
添加了一个运行时子脚本别名用于 ndarray
numpy.typing.NDArray
已添加,是 np.ndarray[Any, np.dtype[~Scalar]]
的运行时子脚本别名。可以使用这个新的类型别名为具有给定数据类型和未指定形状的数组进行注释。 ¹
¹ 目前,NumPy 不支持对数组形状进行标注(截至 1.21 版本),但预计将来会改变(参见PEP 646)。
示例
>>> import numpy as np
>>> import numpy.typing as npt
>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]
>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)
>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
... return np.array(a)
(gh-18935)
示例
>>> import numpy as np
>>> import numpy.typing as npt
>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]
>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)
>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
... return np.array(a)
(gh-18935)
改进
numpy.unwrap
的任意 period
选项
解包相位的区间大小不再限制为 2 * pi
。这对于解包度数特别有用,但也可以用于其他区间。
>>> phase_deg = np.mod(np.linspace(0,720,19), 360) - 180
>>> phase_deg
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180.])
>>> unwrap(phase_deg, period=360)
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
180., 220., 260., 300., 340., 380., 420., 460., 500.,
540.])
(gh-16987)
np.unique
现在只返回单个 NaN
当 np.unique
在具有多个 NaN
条目的数组上操作时,其返回值会为原始数组中每个 NaN
条目包含一个 NaN
。现在已经改进,返回的数组仅包含最后一个 NaN
。
对于复数数组,所有的 NaN
值都被视为等价(无论 NaN
是否在实部或虚部)。作为返回数组的代表,按字典顺序选择最小的一个 - 有关复数数组的字典顺序如何定义,请参见 np.sort
。
(gh-18070)
Generator.rayleigh
和 Generator.geometric
的性能提高了
Generator
中的 Rayleigh 和几何随机变量生成的性能已经提高。这两者都是指数随机变量的转换,而慢速基于对数的逆 cdf 转换已被基于 Ziggurat 的指数变量生成器替换。
这一变化破坏了从这些分布中生成的变量流。
(gh-18666)
占位符注释已经改进
所有先前标注为 typing.Any
的占位符注释都已经改进。在适当的情况下,它们已被明确的函数定义、类或其他杂项对象替换。
(gh-18934)
numpy.unwrap
的任意 period
选项
相位展开的间隔大小不再限制为 2 * pi
。这对于展开度数特别有用,但也可用于其他间隔。
>>> phase_deg = np.mod(np.linspace(0,720,19), 360) - 180
>>> phase_deg
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180.])
>>> unwrap(phase_deg, period=360)
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
180., 220., 260., 300., 340., 380., 420., 460., 500.,
540.])
(gh-16987)
np.unique
现在返回单个 NaN
当 np.unique
在具有多个 NaN
条目的数组上操作时,其返回包括原始数组中每个 NaN
条目的 NaN
。现在改进为返回的数组只包含一个 NaN
,作为最后一个元素。
对于复数数组,所有的 NaN
值都被视为等价(无论 NaN
是否在实部或虚部)。作为返回数组的代表,按字典顺序选择最小的一个 - 有关复数数组的字典顺序如何定义,请参见 np.sort
。
(gh-18070)
Generator.rayleigh
和 Generator.geometric
的性能提高了
Generator
中的 Rayleigh 和几何随机变量生成的性能已经提高。这两者都是指数随机变量的转换,而慢速基于对数的逆 cdf 转换已被基于 Ziggurat 的指数变量生成器替换。
这一变化破坏了从这些分布中生成的变量流。
(gh-18666)
占位符注释已经改进
所有先前标注为 typing.Any
的占位符注释都已经改进。在适当的情况下,它们已被明确的函数定义、类或其他杂项对象替换。
(gh-18934)
性能改进
改进了 NumPy 数组的整数除法性能
NumPy 数组的整数除法现在在除数为常数时使用libdivide。使用 libdivide 和其他次要优化,速度大大提高。//
操作符和np.floor_divide
也使用了新的改动。
(gh-17727)
改进了对小数组的np.save
和np.load
的性能
小数组的np.save
现在也快了很多。
np.load
在对版本 >=(3, 0)
进行序列化时也更快了。
两者都是通过删除仅适用于 Python 2 的检查来完成的,同时仍与可能由 Python 2 创建的数组保持兼容。
(gh-18657)
改进了 NumPy 数组的整数除法性能
NumPy 数组的整数除法现在在除数为常数时使用libdivide。使用 libdivide 和其他次要优化,速度大大提高。//
操作符和np.floor_divide
也使用了新的改动。
(gh-17727)
改进了小数组的np.save
和np.load
的性能
小数组的np.save
现在也快了很多。
np.load
在对版本 >=(3, 0)
进行序列化时也更快了。
两者都是通过删除仅适用于 Python 2 的检查来完成的,同时仍与可能由 Python 2 创建的数组保持兼容。
(gh-18657)
更改
numpy.piecewise
的输出类现在与输入类匹配。
当ndarray
子类用作piecewise
的输入时,它们也会传递给函数。输出现在也将是相同的子类。
(gh-18110)
启用加速框架
随着 macOS 11.3 的发布,使用加速框架的 BLAS 和 LAPACK 实现时 NumPy 遇到的几个不同问题应该得到解决。此更改在 macOS 上启用了加速框架作为选项。如果发现其他问题,请使用开发人员反馈助手工具(developer.apple.com/bug-reporting/
)向加速框架提交 Bug 报告。我们打算及时解决问题,并计划继续支持和更新我们的 BLAS 和 LAPACK 库。
(gh-18874)
numpy.piecewise
的输出类现在与输入类匹配。
当ndarray
子类用于输入到piecewise
时,它们将被传递到这些函数。现在输出将与输入相同的子类。
(gh-18110)
启用加速框架
随着 macOS 11.3 的发布,numpy 在使用加速框架的 BLAS 和 LAPACK 实现时遇到的多种问题应该得到解决。此更改在 macOS 上启用了加速框架作为一个选项。如果发现其他问题,请使用开发者反馈助手工具(developer.apple.com/bug-reporting/
)提交 bug 报告给加速框架。我们打算及时解决问题,并计划继续支持和更新我们的 BLAS 和 LAPACK 库。
(gh-18874)
NumPy 1.20.3 版本说明
Anne Archibald
#18768:BLD:在 MacOS 上转储 gfortran 版本时去掉额外的换行符
贡献者
总共有 7 人为本版本做出了贡献。名字后面带有“+”符号的人是第一次为此贡献补丁。
-
Anne Archibald
-
#18923:BLD:在 macOS 上删除不必要的标志
-faltivec
-
Charles Harris
-
#18769:BUG:修复对象/longdouble 操作中的段错误
-
Dong Keun Oh +
-
Sayed Adel
-
Sebastian Berg
已合并的拉取请求
本篇文档原文:numpy.org/doc/1.26/release/1.20.3-notes.html
-
#18763:BUG:修正了
datetime64
缺失的datetime.date
类型重载… -
#18764:MAINT:移除
__all__
,使用显式重新导出 -
Kamil Choudhury +
-
贡献者
-
#18794:MAINT:明确使用 towncrier 构建
-
#18887:MAINT:放宽某些整数类型的约束
-
#18915:MAINT:从返回注释中移除不安全的联合和 ABC
-
#18921:MAINT:允许更多的标量测试递归深度。
-
#18922:BUG:在发生错误的情况下初始化完整的 nditer 缓冲区
-
完。
-
#18924:MAINT,CI:将 _SIMD 模块构建警告视为错误通过…
-
#18925:BUG:对于 MINGW,需要 GLIBC > 2.12 的 threads.h 存在检测
-
#18941:BUG:使变更日志识别 gh-作为 PR 号前缀。
-
#18948:REL,DOC:为 NumPy 1.20.3 版本做准备。
-
#18953:BUG:修复 1.20.x 中 mypy 测试失败。
Dong Keun Oh +
共有 7 人为本版本做出了贡献。名字后面带有“+”符号的人是第一次为此贡献补丁。
-
Kamil Choudhury +
-
Bas van Beek
-
Charles Harris
-
NumPy 1.20.3 版是在 NumPy 1.20.2 版本发布后,合并到主分支的几个修复的 bugfix 版本。
-
Bas van Beek
-
Sayed Adel
-
Sebastian Berg
已合并的拉取请求
总共有 15 个拉取请求被合并到本版本中。
-
#18763:BUG:修正了
datetime64
缺失的datetime.date
类型重载… -
#18764:MAINT:移除
__all__
,使用显式重新导出 -
#18768:BLD:在 MacOS 上转储 gfortran 版本时去掉额外的换行符
-
#18769:BUG:修复对象/longdouble 操作中的段错误
-
#18794:MAINT:明确使用 towncrier 构建。
-
#18887:MAINT:放宽某些整数类型约束。
-
#18915:MAINT:从返回注释中删除不安全的联合体和 ABCs。
-
#18921:MAINT:允许更多的标量测试递归深度。
-
#18922:BUG:在出错情况下初始化完整的 nditer 缓冲区。
-
#18923:BLD:在 macOS 上删除不必要的标志
-faltivec
。 -
#18924:MAINT,CI:通过...将 _SIMD 模块构建警告视为错误。
-
#18925:BUG:对于 MINGW,threads.h 的存在测试需要 GLIBC > 2.12。
-
#18941:BUG:使变更日志识别 gh-作为 PR 号前缀。
-
#18948:REL,DOC:准备 NumPy 1.20.3 版本的发布。
-
#18953:BUG:修复 1.20.x 中失败的 mypy 测试。
NumPy 1.20.2 发布说明
NumPy 1.20.2 是一个修复 bug 的版本,包含在 NumPy 1.20.1 发布之后合并到主分支的几个修复。
贡献者
总共有 7 人参与了这次发布。在其名字后面有“+”号的人第一次贡献了补丁。
-
Allan Haldane
-
Bas van Beek
-
Charles Harris
-
Christoph Gohlke
-
Mateusz Sokół +
-
Michael Lamparski
-
Sebastian Berg
合并的拉取请求
总共有 20 个拉取请求合并到此次发布。
-
#18382:MAINT:从主分支更新 f2py。
-
#18459:BUG:
diagflat
在 Windows 或 32 位平台可能溢出 -
#18460:BUG:修复 f2py
complex_double_from_pyobj
中的引用计数泄漏。 -
#18461:BUG:当使用
like=
覆盖时修复小的内存泄漏 -
#18462:BUG:移除 VOID 函数中的描述符/标志的临时更改
-
#18469:BUG:Object 数组的 nditer 缓冲区 dealloc 中出现段错误
-
#18485:BUG:移除可疑的类型转换
-
#18486:BUG:移除无意义的指针比较
-
#18487:BUG:在使用之前验证指针是否为空
-
#18488:BUG:检查 PyArray_malloc 是否成功
-
#18546:BUG:nditer 中出现错误的错误路径
-
#18559:CI:从主分支回溯 CI 修复。
-
#18599:MAINT:为
dtype.__getitem__
、__mul__
和...添加注释 -
#18611:BUG:在 numpy.distutils.fcompiler.compaq 中出现 NameError 错误
-
#18612:BUG:修复
np.mean
和np.var
方法的where
关键字 -
#18617:CI:Python 安装前更新 apt 软件包列表
-
#18636:MAINT:确保重新导出的子模块正确标注
-
#18638:BUG:修复 ma 强制类型转换为列表的问题,如果它们不能转换为...
-
#18661:BUG:修复 valgrind 发现的小问题
-
#18671:BUG:修复 pytest-leaks 发现的小问题
贡献者
总共有 7 人参与了这次发布。在其名字后面有“+”号的人第一次贡献了补丁。
-
Allan Haldane
-
Bas van Beek
-
Charles Harris
-
Christoph Gohlke
-
Mateusz Sokół +
-
Michael Lamparski
-
Sebastian Berg
合并的拉取请求
总共有 20 个拉取请求合并到此次发布。
-
#18382: MAINT: 从 master 更新 f2py。
-
#18459: BUG:
diagflat
在 Windows 或 32 位平台上可能溢出 -
#18460: BUG: 修复 f2py
complex_double_from_pyobj
中的引用计数泄漏。 -
#18461: BUG: 修复
like=
重写时的微小内存泄漏 -
#18462: BUG: 移除 VOID 函数中 descr/flags 的临时更改
-
#18469: BUG: 对于 Object 数组,在 nditer 缓冲区 dealloc 时发生段错误
-
#18485: BUG: 移除可疑类型转换
-
#18486: BUG: 移除无意义的指针比较小于 0
-
#18487: BUG: 在使用指针之前验证指针是否为空
-
#18488: BUG: 检查 PyArray_malloc 是否成功
-
#18546: BUG: nditer 中错误的错误传递
-
#18559: CI: 从主版本中回退 CI 修复。
-
#18599: MAINT: 为
dtype.__getitem__
, mul和...添加注释 -
#18611: BUG: numpy.distutils.fcompiler.compaq 中的 NameError
-
#18612: BUG: 修复
np.mean
和np.var
方法中where
关键字 -
#18617: CI: Python 安装前更新 apt 软件包列表
-
#18636: MAINT: 确保重新导出的子模块被正确注释
-
#18638: BUG: 修复 ma coercion list-of-ma-arrays if they do not cast to...
-
#18661: BUG: 修复 valgrind 发现的小问题
-
#18671: BUG: 修复 pytest-leaks 发现的小问题
NumPy 1.20.1 发布说明
NumPy 1.20.1 是一个快速的 bug 修复版本,修复了 1.20.0 发布后报告的几个错误和回归。
亮点
-
修复了导致下游项目出现问题的 distutils bug。
-
random.shuffle
回归了。
贡献者
这个版本的发布共有 8 人做出了贡献。名字旁边带有“+”符号的人第一次为该版本贡献了补丁。
-
Bas van Beek
-
查尔斯·哈里斯
-
尼古拉斯·麦克布恩 +
-
佩鲁·彼得森
-
拉尔夫·戈默斯
-
塞巴斯蒂安·贝格
-
泰勒·雷迪
-
@Aerysv +
合并的拉取请求
这个版本共有 15 个拉取请求合并。
-
#18306:维护:添加遗漏的占位符注释
-
#18310:BUG:修复
numpy.__init__.py
中的拼写错误 -
#18326:BUG:在遍历过程中不要改变假库列表...
-
#18327:维护:优雅地洗牌 memoryviews
-
#18328:BUG:使用 C 链接来在随机分布中
-
#18336:CI:修复 GitHub Actions 构建触发时的问题,并允许 ci 跳过
-
#18337:BUG:允许 timedelta 与 isclose、allclose、等等不做修改的使用
-
#18345:BUG:允许对所有相关的 DType 类型/类进行 pickling
-
#18351:BUG:修复缺少的 signed_char 依赖。关闭 #18335。
-
#18352:DOC:更改许可证日期 2020 -> 2021
-
#18353:CI:CircleCI 似乎偶尔超时,增加限制
-
#18354:BUG:修复包装 F90 子例程时的 f2py bug。
-
#18356:维护:crackfortran 正则表达式简化
-
#18357:BUG:threads.h 存在性测试需要 GLIBC > 2.12。
-
#18359:REL:为 NumPy 1.20.1 版本做准备。
亮点
-
修复了导致下游项目出现问题的 distutils bug。
-
random.shuffle
回归了。
贡献者
这个版本的发布共有 8 人做出了贡献。名字旁边带有“+”符号的人第一次为该版本贡献了补丁。
-
Bas van Beek
-
查尔斯·哈里斯
-
尼古拉斯·麦克布恩 +
-
佩鲁·彼得森
-
拉尔夫·戈默斯
-
塞巴斯蒂安·贝格
-
泰勒·雷迪
-
@Aerysv +
合并的拉取请求
这个版本共有 15 个拉取请求合并。
-
#18306:维护:添加遗漏的占位符注释
-
#18310:BUG:修复
numpy.__init__.py
中的拼写错误 -
#18326:BUG:不要在遍历过程中改变假库列表...
-
#18327: MAINT: 优雅地洗牌 memoryviews
-
#18328: BUG: 为随机分布使用 C 语言链接
-
#18336: CI: 修复 GitHub Actions 构建触发时的问题,并允许跳过 CI
-
#18337: BUG: 允许使用 isclose、allclose 等与 timedelta 未修改的用法
-
#18345: BUG: 允许对所有相关的 DType 类型/类进行 pickle
-
#18351: BUG: 修复缺少的 signed_char 依赖项。关闭 #18335。
-
#18352: DOC: 将许可证日期从 2020 改为 2021
-
#18353: CI: CircleCI 似乎偶尔超时,请增加限制
-
#18354: BUG: 修复包装 F90 子程序时的 f2py 错误。
-
#18356: MAINT: 简化 crackfortran 正则表达式
-
#18357: BUG: threads.h 存在测试要求 GLIBC > 2.12。
-
#18359: REL: 为 NumPy 1.20.1 版本做好准备。
NumPy 1.20.0 发布说明
这次 NumPy 发布是迄今为止最大的,共有 684 个 PRs 由 184 人贡献并已合并。有关此次发布支持的 Python 版本为 3.7-3.9,不再支持 Python 3.6。重点是
-
NumPy 函数的注释。这项工作正在进行中,预计会根据用户的反馈进行改进。
-
更广泛地使用 SIMD 以增加 ufuncs 的执行速度。在不同的硬件平台上引入了将简化对现代特性的使用的通用函数的工作。此项工作正在进行中。
-
在更改 dtype 和转换实现方案方面做出了初步工作,以便提供更简单的路径来扩展 dtypes。这项工作正在进行中,但已经做得足够多以允许进行实验和反馈。
-
大量的文档改进,合并了大约 185 个 PR。这项工作正在进行中,是改进 NumPy 在线存在和对新用户有用性的较大项目的一部分。
-
进一步清理与移除 Python 2.7 相关的工作。这有助于提高代码的可读性并消除技术债务。
-
对即将推出的 Cython 3.0 的初步支持。
新函数
random.Generator 类具有一个新的 permuted
函数。
新函数与 shuffle
和 permutation
的不同之处在于,由轴索引的子数组进行了排列,而不是将轴视为其他索引的每个组合的独立 1-D 数组。例如,现在可以对 2-D 数组的行或列进行排列。
(gh-15121)
sliding_window_view
为 numpy 数组提供了滑动窗口视图。
numpy.lib.stride_tricks.sliding_window_view
构建了 numpy 数组的视图,提供了对数组的滑动或移动窗口访问。这允许简单地实现某些算法,例如运行均值。
(gh-17394)
numpy.broadcast_shapes
是一种新的面向用户的函数。
broadcast_shapes
从对给定形状元组进行广播获取生成的形状。
>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)
>>> np.broadcast_shapes(2, (3, 1))
(3, 2)
>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)
(gh-17535)
弃用
已弃用使用内置类型的别名,如 np.int
。
长期以来,np.int
一直是内置 int
的别名。这一直是新手困惑的原因,在主要是出于历史原因。
这些别名已经被弃用。下表显示了被弃用别名的完整列表,以及它们的确切含义。用第一列中的项目替换为第二列的内容将完全相同,并且可以消除弃用警告。
第三列列出了偶尔更好的替代 NumPy 名称。另请参阅数据类型以获取更多详细信息。
弃用的名称 | 相同于 | NumPy 标量类型名称 |
---|---|---|
numpy.bool |
bool |
numpy.bool_ |
numpy.int |
int |
numpy.int_ (默认), numpy.int64 , 或 numpy.int32 |
numpy.float |
float |
numpy.float64 , numpy.float_ , numpy.double (等效) |
numpy.complex |
complex |
numpy.complex128 , numpy.complex_ , numpy.cdouble (等效) |
numpy.object |
object |
numpy.object_ |
numpy.str |
str |
numpy.str_ |
numpy.long |
int |
numpy.int_ (C long ), numpy.longlong (最大的整数类型) |
numpy.unicode |
str |
numpy.unicode_ |
为了为绝大多数情况提供明确的指导,对于类型 bool
, object
, str
(以及 unicode
),使用普通版本会更简短、清晰,通常是很好的替代方式。对于 float
和 complex
,如果您希望更明确地表示精度,可以使用 float64
和 complex128
。
对于 np.int
,直接用 np.int_
或 int
替换也很好,并且不会改变行为,但精度仍然取决于计算机和操作系统。如果您想要更明确地审查并调查当前使用情况,您有以下替代方案:
-
用
np.int64
或np.int32
来精确指定精度。这确保了结果不会取决于计算机或操作系统。 -
np.int_
或int
(默认),但请注意这取决于计算机和操作系统。 -
C 类型:
np.cint
(int),np.int_
(long),np.longlong
。 -
np.intp
在 32 位机器上为 32 位,在 64 位机器上为 64 位。这可能是最好的索引使用类型。
当与np.dtype(...)
或dtype=...
一起使用时,将其更改为上述所提及的 NumPy 名称对输出没有影响。如果用作标量使用:
np.float(123)
改变它可能会微妙地改变结果。在这种情况下,通常更喜欢 Python 版本的float(123)
或int(12.)
,尽管 NumPy 版本可能对于与 NumPy 数组的一致性而言可能更有用(例如,对于诸如零除法之类的事情,NumPy 会有不同的行为)。
(gh-14882)
向带有非可选形状参数的函数传递shape=None
是被弃用的
以前,这是传递shape=()
的别名。这是由 C API 中的PyArray_IntpConverter发出的弃用警告。如果您的 API 意图支持传递None
,那么您应该在调用转换器之前检查None
,以便能够区分None
和()
。
(gh-15886)
即使索引结果为空,也会报告索引错误
今后,当整数数组索引包含超出边界值时,NumPy 将引发 IndexError,即使未索引的维度长度为 0。这将会发出 DeprecationWarning。当数组之前为空,或者涉及一个空切片时,就会发生这种情况:
arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]
以前,非空索引[20]
未经检查正确性。现在将会检查并引发弃用警告,并将其转变为错误。这也适用于赋值。
(gh-15900)
对于mode
和searchside
不精确匹配是被弃用的
以前,对mode
和searchside
的不精确和不区分大小写的匹配是有效输入,并且现在会发出 DeprecationWarning。例如,以下是现在已弃用并将发出 DeprecationWarning 的一些示例用法:
import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap") # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random') # should be "right"
(gh-16056)
numpy.dual已弃用
模块numpy.dual已被弃用。不应再从numpy.dual导入函数,而应该直接从 NumPy 或 SciPy 导入函数。
(gh-16156)
outer
和ufunc.outer
对矩阵是被弃用的
np.matrix
在outer
或通用 ufunc outer 调用(例如numpy.add.outer
)中的使用。以前,矩阵在此处被转换为数组。今后将不再这样做,需要手动将其转换为数组。
(gh-16232)
更多数字风格类型被弃用
剩余的数字风格类型代码Bytes0
、Str0
、Uint32
、Uint64
和Datetime64
都已被弃用。应该改用小写变体。对于字节和字符串,"S"
和"U"
也是可选的替代方案。
(gh-16554)
ndindex
的ndincr
方法已被弃用
从 NumPy 1.8 开始,文档已警告不要使用此功能。应该使用next(it)
代替it.ndincr()
。
(gh-17233)
未定义__len__
和__getitem__
的 ArrayLike 对象
定义__array__
、__array_interface__
或__array_struct__
协议之一但不是序列(通常定义为有__len__
和__getitem__
的对象)的对象,在将来进行数组强制转换时将会有不同的行为。
当嵌套在序列中,例如np.array([array_like])
,这些内容将被处理为单个 Python 对象而不是数组。将来它们将与以下内容行为一致:
np.array([np.array(array_like)])
如果np.array(array_like)
不是 0 维的,这种变更只会对此警告产生影响。解决此警告可能取决于对象:
-
一些数组样式可能会期望新的行为,而用户可以忽略警告。对象可以选择公开序列协议以选择新行为。
-
例如,
shapely
将允许使用line.coords
而不是np.asarray(line)
进行类似数组的转换。用户可以绕过警告,或者在新约定可用时使用它。
不幸的是,只能通过调用np.array(array_like)
来使用新行为。
如果希望确保旧行为保持不变,请首先创建一个对象数组,然后显式地填充它,例如:
arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]
这样可以确保 NumPy 知道不要将其视为数组,而是将其视为对象。
(gh-17973)
未来变化
数组不能使用子数组类型
使用np.array(arr, dtype)
和arr.astype(dtype)
进行数组创建和转换将在dtype
为诸如np.dtype("(2)i,")
的子数组 dtype 时使用不同的逻辑。
对于这样的dtype
,以下行为是正确的:
res = np.array(arr, dtype)
res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape
但res
使用以下逻辑填充:
res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr
这将使用不正确的广播(通常会导致错误)。将来,这将分别转换每个元素,导致与以下结果相同:
res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]
这通常可以用于选择新行为。
此更改不会影响np.array(list, dtype="(2)i,")
,除非list
本身包含至少一个数组。特别是,对于元组列表,行为不变。
(gh-17596)
已过期的停用内容
-
数值样式类型代码
np.dtype("Complex64")
(大写拼写)已过期。"Complex64"
对应于"complex128"
,而"Complex32"
对应于"complex64"
。 -
np.sctypeNA
和np.typeNA
的停用期已过。它们已从公共 API 中删除。请使用np.typeDict
代替。(gh-16554)
-
np.ctypeslib.ctypes_load_library
的 14 年停用期已过。请使用load_library
,它与原功能完全相同。(gh-17116)
移除财务功能
符合 NEP 32 的规定,NumPy 1.20 将删除财务函数。被删除的函数有fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和rate
。这些函数在numpy_financial库中可用。
(gh-17067)
兼容性说明
isinstance(dtype, np.dtype)
而不是type(dtype) is not np.dtype
NumPy 的数据类型现在不再是np.dtype
的直接实例。可能使用了type(dtype) is np.dtype
的代码将始终返回False
,必须更新为使用正确的版本isinstance(dtype, np.dtype)
。
此更改还会影响兼容性方面的宏PyArray_DescrCheck
,如果针对的是早于 1.16.6 版的 NumPy 进行编译。如果代码使用了该宏,并希望针对旧版本的 NumPy 进行编译,必须替换该宏(也见 C API changes 部分)。
在axis=None
情况下 concatenate 中的 same kind 转换
当以axis=None
调用concatenate
时,被展平的数组会使用unsafe
进行转换。任何其他轴选择都会使用“same kind”。这种不同的默认值已经被弃用,将使用“same kind”转换。新的casting
关键字参数可用于保留旧的行为。
(gh-16134)
当 NumPy 标量分配给数组时会发生强制转换
在创建或分配数组时,在所有相关情况下,NumPy 标量现在将被与 NumPy 数组完全相同地进行强制转换。特别是这将改变一些以前会引发错误的情况的行为:
np.array([np.float64(np.nan)], dtype=np.int64)
将会成功,并返回一个未定义的结果(通常是可能的最小整数)。这也会影响分配:
arr[0] = np.float64(np.nan)
此时,NumPy 保留以下内容的行为:
np.array(np.float64(np.nan), dtype=np.int64)
以上更改不会影响 Python 标量:
np.array([float("NaN")], dtype=np.int64)
保持不变(np.nan
是 Python 的float
,而不是 NumPy 的)。与有符号整数不同,无符号整数不保留这种特殊情况,因为它们一直更像是强制转换。以下代码不再引发错误:
np.array([np.float64(np.nan)], dtype=np.uint64)
为避免向后兼容性问题,此时从datetime64
标量分配给长度过短的字符串仍然受支持。这意味着np.asarray(np.datetime64("2020-10-10"), dtype="S5")
现在可以成功,而之前不行。从长远来看,这可能会被弃用,或者不安全的强制转换可能被普遍允许,以使数组和标量的分配行为一致。
在混合字符串和其他类型时,数组的强制转换发生了变化
当字符串和其他类型混合时,例如:
np.array(["string", np.float64(3.)], dtype="S")
结果将发生变化,这可能导致在某些情况下具有更长字符串的字符串数据类型。特别是,如果未提供dtype="S"
,任何数值都将导致字符串足够长以容纳所有可能的数值(例如,“S32”用于浮点数)。请注意,当将非字符串转换为字符串时,应始终提供dtype="S"
。
如果提供了 dtype="S"
,结果将与以前大体相同,但是 NumPy 标量类型(不是像 1.0
这样的 Python 浮点数)仍将强制执行统一的字符串长度:
np.array([np.float64(3.)], dtype="S") # gives "S32"
np.array([3.0], dtype="S") # gives "S3"
以前的第一个版本给出与第二个版本相同的结果。
数组强制转换重构
数组强制转换已重构。一般情况下,这不应影响用户。在极为罕见的角落情况下,其中类数组对象是嵌套的:
np.array([array_like1])
现在将更一致地处理:
np.array([np.array(array_like1)])
这可能会微妙地改变一些定义不良的类数组对象的输出。其中一个例子是不是也是匹配形状的序列的类数组对象。在 NumPy 1.20 中,当类数组对象不是序列时将给出警告(但行为保持不变,请参阅弃用)。如果类数组对象也是序列(定义了 __getitem__
和 __len__
),NumPy 现在将仅使用由 __array__
,__array_interface__
或 __array_struct__
给出的结果。当(嵌套的)序列描述不同的形状时,这将导致差异。
(gh-16200)
写入numpy.broadcast_arrays
的结果将导出只读缓冲区
在 NumPy 1.17 中 numpy.broadcast_arrays
开始在写入结果数组时发出警告。在通过缓冲器接口使用数组时(例如 memoryview(arr)
),将跳过此警告。现在对于返回只读缓冲器的两个协议 __array_interface__
和 __array_struct__
也将发生相同的情况,而不是发出警告。
(gh-16350)
数字样式的类型名称已从类型字典中移除
为了与 np.dtype("Complex64")
和其他数字样式(大写)类型的弃用保持同步。这些已从 np.sctypeDict
和 np.typeDict
中移除。您应该改用小写版本。请注意,"Complex64"
对应于"complex128"
,"Complex32"
对应于"complex64"
。NumPy 样式(新版本)表示完整大小而不是实部/虚部的大小。
(gh-16554)
operator.concat
函数现在对数组参数引发 TypeError
异常
先前的行为是退回到加法并加上这两个数组,这被认为是连接函数的意外行为。
(gh-16570)
nickname
属性已从 ABCPolyBase 中移除
抽象属性 nickname
已从 ABCPolyBase
中移除,因为它已不再在派生的便利类中使用。这可能会影响从 ABCPolyBase
派生类并覆盖表示和显示方法的用户,例如 __str__
,__repr__
,_repr_latex
等。
(gh-16589)
float->timedelta
和uint64->timedelta
提升将引发一个 TypeError
浮点数和时间增长一致地引发 TypeError。现在np.promote_types("float32", "m8")
与np.promote_types("m8", "float32")
一致,并且都会引发一个 TypeError。以前,np.promote_types("float32", "m8")
返回"m8"
被认为是一个错误。
Uint64 和时间增长现在一致地引发 TypeError。现在np.promote_types("uint64", "m8")
与np.promote_types("m8", "uint64")
一致,并且都会引发一个 TypeError。以前,np.promote_types("uint64", "m8")
返回"m8"
被认为是一个错误。
(gh-16592)
numpy.genfromtxt
现在可以正确地解包结构化数组
以前,当使用unpack=True
并且将结构化数据类型传递给dtype
参数(或者传递dtype=None
并且推断出结构化数据类型)时,numpy.genfromtxt
会解包失败。例如:
>>> data = StringIO("21 58.0\n35 72.0")
>>> np.genfromtxt(data, dtype=None, unpack=True)
array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])
结构化数组现在将正确地解包为一个数组列表,每个列一个:
>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]
(gh-16650)
mgrid
、r_
等现在对于非默认精度输入始终返回正确的输出
以前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]
和np.r_[0:10:np.complex64(3j)]
无法返回有意义的输出。这个 bug 可能会影响到mgrid
、ogrid
、r_
、以及c_
的输入,当使用的 dtype 不是默认的float64
和complex128
以及等效的 Python 类型时。这些方法已经被修复,以正确处理不同的精度。
(gh-16815)
具有不匹配形状的布尔数组索引现在会正确地给出IndexError
以前,如果布尔数组索引与被索引数组的大小匹配但形状不匹配,则在某些情况下会被错误地允许。在其他情况下,它会出错,但错误会不正确地是关于广播的ValueError
,而不是正确的IndexError
。
例如,以下内容以前会错误地给出ValueError: operands could not be broadcast together with shapes (2,2) (1,4)
:
np.empty((2, 2))[np.array([[True, False, False, False]])]
以前,以下内容会错误地返回array([], dtype=float64)
:
np.empty((2, 2))[np.array([[False, False, False, False]])]
现在都可以正确地给出IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1
。
(gh-17010)
强制转换错误中断迭代
在迭代时进行值转换,错误可能会比以前导致迭代提前停止。在任何情况下,失败的类型转换操作总是返回未定义的部分结果。现在可能更加未定义和部分。对于使用NpyIter
C-API 的用户,这样的类型转换错误现在会导致iternext()函数返回 0,因此中止迭代。目前,没有 API 直接检测这样的错误。需要检查PyErr_Occurred()
,这可能在与NpyIter_Reset
结合时有问题。这些问题一直存在,但如果用户需要,可以添加新的 API。
(gh-17029)
f2py 生成的代码可能返回 unicode 而不是字节字符串
之前由 f2py 生成的代码返回的一些字节字符串现在可能是 unicode 字符串。这是由正在进行的 Python2 到 Python3 清理导致的。
(gh-17068)
__array_interface__["data"]
元组的第一个元素必须是整数
这已经是多年的文档接口,但仍然有代码会接受指针地址的字节字符串表示。该代码已被移除,传递地址作为字节字符串现在会引发错误。
(gh-17241)
poly1d
遵循所有零参数的 dtype
之前,使用所有零系数构造poly1d
的实例会将系数转换为np.float64
。这会影响内部构造poly1d
实例的方法的输出 dtype,比如np.polymul
。
(gh-17577)
swig 的 numpy.i 文件现在只支持 Python 3。
Python 2.7 的 C-API 函数已经更新为只支持 Python 3。需要旧版本的用户应该从旧版本的 NumPy 获取。
(gh-17580)
np.array
的空 dtype 检测
在使用np.array(..., dtype="V")
、arr.astype("V")
等调用时,除非所有元素的 void 长度相同,否则将正确引发 TypeError。一个例子是:
np.array([b"1", b"12"], dtype="V")
之前返回的数组的 dtype 是"V2"
,不能准确表示b"1"
。
(gh-17706)
C API 的变化
PyArray_DescrCheck
宏已被修改
PyArray_DescrCheck
宏自 NumPy 1.16.6 以来已经更新为:
#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)
从 NumPy 1.20 开始,针对先前版本编译的代码将与 NumPy 1.20 不兼容。修复的方法是要么针对 1.16.6 进行编译(如果您希望支持的最旧版本为 NumPy 1.16),要么通过将其替换为新定义来手动内联宏:
PyObject_TypeCheck(op, &PyArrayDescr_Type)
与所有 NumPy 版本兼容。
np.ndarray
和np.void_
的大小变化
PyArrayObject
和PyVoidScalarObject
结构的大小已经改变。已删除以下头文件定义:
#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))
因为大小不应被视为编译时常量:对于 NumPy 的不同运行时版本,它会改变。
最可能相关的用途是用 C 编写的潜在子类,它们将需要重新编译并应该进行更新。请参阅PyArrayObject
的文档以获取更多详细信息,并如果受到此更改的影响,请联系 NumPy 开发人员。
NumPy 将尝试给出优雅的错误,但一个期望固定结构大小的程序可能会有未定义的行为并可能崩溃。
(gh-16938)
新特性
numpy.all
和numpy.any
函数的where
关键参数
where
关键参数被添加,允许在布尔评估all
和any
时只考虑数组中指定的元素或子轴。这个新关键字可通过numpy
的all
和any
函数直接使用或在numpy.ndarray
的方法中使用。
任意可广播的布尔数组或标量都可以设置为where
。如果用户未设置where
,默认为True
,以评估数组中的所有元素的函数。示例在函数的文档中给出。
numpy
函数mean
、std
、var
的where
关键参数
添加where
关键参数,允许将mean
、std
和var
的计算范围限制为仅一部分元素。可直接通过numpy
使用,也可在numpy.ndarray
的方法中使用。
任意可广播的布尔数组或标量都可以设置为where
。如果用户未设置where
,默认为True
,以评估数组中的所有元素的函数。示例在函数的文档中给出。
(gh-15852)
norm=backward
、forward
关键选项用于numpy.fft
函数
关键参数选项norm=backward
被添加作为None
的别名,并作为默认选项;使用它会使直接转换不经缩放,而逆转换经缩放乘以1/n
。
使用新的关键参数选项norm=forward
会使直接转换经缩放乘以1/n
,逆转换不经缩放(即与默认选项norm=backward
完全相反)。
(gh-16476)
NumPy 现在已经有了类型
对 NumPy 的大部分部分添加了类型注释。还有一个新的numpy.typing
模块,其中包含了对最终用户有用的类型。目前可用的类型有
-
ArrayLike
:可转换为数组的对象 -
DtypeLike
:可转换为 dtype 的对象
(gh-16515)
numpy.typing
在运行时可访问
现在numpy.typing
中的类型可以在运行时导入。以下代码现在可以使用:
from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]
(gh-16558)
f2py 生成的模块现在有新的 __f2py_numpy_version__
属性。
因为 f2py 与 NumPy 一起发布,__f2py_numpy_version__
提供了跟踪使用的 f2py 版本生成模块的方法。
(gh-16594)
可以通过 runtests.py 运行 mypy
测试
当前运行 mypy 配置了 NumPy 存根需要以下两者之一:
-
安装 NumPy
-
将源目录添加到 MYPYPATH 并链接到
mypy.ini
这两个选项都有点不方便,因此添加一个 --mypy
选项来运行测试,它会帮助为你设置一切。这在将来对于任何类型代码生成也将非常有用,因为它会确保在类型检查之前构建项目。
(gh-17123)
对用户定义的 BLAS/LAPACK 探测顺序进行否定
distutils
在确定 BLAS/LAPACK 库时允许否定库。这可以用于在库解析阶段移除元素,即禁止使用 NetLIB 库,可以这样做:
NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build
那将使用任何加速库。
(gh-17219)
允许将优化参数传递给 asv 构建
现在,当使用 --bench-compare
参数时,可以将 -j
、 --cpu-baseline
、 --cpu-dispatch
和 --disable-optimization
标志传递给 ASV 构建。
(gh-17284)
NVIDIA HPC SDK nvfortran 编译器现已得到支持
已添加对 nvfortran 编译器的支持,该编译器是 pgfortran 的一种版本。
(gh-17344)
cov
和 corrcoef
的 dtype
选项
dtype
选项现在适用于 numpy.cov
和 numpy.corrcoef
。它指定返回结果应具有的数据类型。默认情况下,这些函数仍然返回一个 numpy.float64
结果。
(gh-17456)
改进
对于多项式的改进的字符串表示(__str__
)
numpy.polynomial
中所有六种多项式类型的字符串表示(__str__
)已更新,更改为提供多项式的数学表达式,而不是系数的数组。有两种包范围的多项式表达格式可用——一种使用上标和下标的 Unicode 字符,另一种仅使用 ASCII 字符。
(gh-15666)
将 Accelerate 库移除作为可选的 LAPACK 库
苹果不再支持 Accelerate 。移除它。
(gh-15759)
包含多行对象的对象数组具有更可读的repr
如果对象数组的元素包含包含有换行符的 repr
,那么被折行的行将按列对齐。特别地,这改善了嵌套数组的 repr
:
>>> np.array([np.eye(2), np.eye(3)], dtype=object)
array([array([[1., 0.],
[0., 1.]]),
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])], dtype=object)
(gh-15997)
Concatenate 支持提供输出的数据类型
在 concatenate
中增加了对提供输出 dtype
和 casting
的支持,使用关键字参数。 dtype
参数不能与 out
参数一起提供。
(gh-16134)
f2py 回调函数线程安全
f2py 中的回调函数现在是线程安全的。
(gh-16519)
numpy.core.records.fromfile
现在支持类文件对象
numpy.rec.fromfile
现在可以使用类文件对象,例如 io.BytesIO
(gh-16675)
AIX 上的 distutils 增加了 RPATH 支持
这使得可以在 AIX 上构建 SciPy。
(gh-16710)
使用由命令行参数指定的 f90 编译器
对于 Fortran Portland Group Compiler,numpy.distutils.fcompiler
中选择的编译器命令已更改。这仅影响链接命令。这迫使使用命令行选项提供的可执行文件(如果有的话),而不是 pgfortran 可执行文件。如果命令行选项没有提供可执行文件,默认为 pgf90 可执行文件,根据 PGI 文档,它是 pgfortran 的别名。
(gh-16730)
为 Cython 3.0 及更高版本添加了 NumPy 声明
Cython 3.0 的 pxd 声明得到改进,避免使用了已弃用的 NumPy C-API 特性。使用 Cython 3.0+ 构建的扩展模块,使用 NumPy 的话现在可以设置 C 宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,以避免 C 编译器对弃用 API 使用的警告。
(gh-16986)
使窗口函数完全对称
确保 NumPy 提供的窗口函数是对称的。 以前由于数值精度的原因,对称性存在小偏差,现在通过更好地安排计算来避免。
(gh-17195)
性能改进和更改
启用多平台 SIMD 编译器优化
一系列的 NumPy 基础设施改进,为 NEP-38鋪平了道路,可以概括如下:
-
新的构建参数
-
--cpu-baseline
用于指定所需的最小优化集,默认值为min
,提供的是可以安全运行在广泛用户平台上的最小 CPU 功能。 -
--cpu-dispatch
用于指定附加优化的调度集,默认值为max -xop -fma4
,启用除 AMD 传统特性外的所有 CPU 特性。 -
--disable-optimization
明确禁用所有新的改进,它还添加了名为NPY_DISABLE_OPTIMIZATION
的新的C编译器#定义,可以用作任何 SIMD 代码的保护。
-
-
高级 CPU 调度程序
基于 Python/Numpy distutils 的灵活的跨架构 CPU 调度程序,支持所有常见的编译器和广泛的 CPU 特性。
新的调度程序需要特殊的文件扩展名
*.dispatch.c
标记可调度的C源文件。这些源文件可以编译多次,每个编译过程表示特定的 CPU 特性,并提供影响代码路径的不同#定义和标志。 -
新自动生成的 C 标头
core/src/common/_cpu_dispatch.h
此标头由 distutils 模块
ccompiler_opt
生成,并包含所有通过命令参数‘–cpu-baseline’和‘–cpu-dispatch’配置的指令集的#定义和标头。 -
新的 C 标头
core/src/common/npy_cpu_dispatch.h
此标头包含了整个 CPU 调度过程所需的所有实用程序,它还可以被看作是将新的基础设施工作与 NumPy CPU 运行时检测连接起来的桥梁。
-
向 NumPy umath 模块(Python 级别)添加新属性
-
__cpu_baseline__
是一个列表,包含了编译器和平台支持的必需优化的最小集合,根据命令参数‘–cpu-baseline’指定的值。 -
__cpu_dispatch__
是一个列表,包含了编译器和平台支持的根据命令参数‘–cpu-dispatch’指定值的附加优化的调度集。
-
-
在 PytestTester 运行期间打印支持的 CPU 特性
(gh-13516)
变化
更改了divmod(1., 0.)
和相关函数的行为
这些变化还确保了不同的编译器版本在这些操作中对 nan 或 inf 使用具有相同的行为。这之前是依赖于编译器的,现在我们强制无效和除 0 标志,使结果在不同编译器下相同。例如,gcc-5、gcc-8 或 gcc-9 现在都产生相同的行为。变化如下:
新行为摘要
操作符 | 旧警告 | 新警告 | 旧结果 | 新结果 | 适用于 MacOS |
---|---|---|---|---|---|
np.divmod(1.0, 0.0) | 无效 | 无效和除 0 | nan, nan | inf, nan | 是 |
np.fmod(1.0, 0.0) | 无效 | 无效 | nan | nan | 否?是 |
np.floor_divide(1.0, 0.0) | 无效 | 除 0 | nan | inf | 是 |
np.remainder(1.0, 0.0) | 无效 | 无效 | nan | nan | 是 |
(gh-16161)
np.linspace
在整数上现在使用 floor
在使用int
类型的时候,以前 float 值会被向零舍入。现在使用numpy.floor
来代替,它向下取整。这会改变负值的结果。例如,以前会得到以下结果:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
现在结果是:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1, 0, 1])
以前的结果仍然可以得到:
>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
(gh-16841)
新函数
random.Generator 类新增了一个permuted
函数。
这个新函数与shuffle
和permutation
不同之处在于,由轴索引的子数组被排列,而不是将轴视为每个其他索引组合的独立 1-D 数组。例如,现在可以对 2-D 数组的行或列进行排列。
(gh-15121)
sliding_window_view
为 numpy 数组提供了一个滑动窗口视图
numpy.lib.stride_tricks.sliding_window_view
构建了 numpy 数组上的视图,提供了对数组的滑动或移动窗口访问。这允许简单实现某些算法,例如运行均值。
(gh-17394)
numpy.broadcast_shapes
是一个新的面向用户的函数。
broadcast_shapes
从广播给定的形状元组的结果形状。
>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)
>>> np.broadcast_shapes(2, (3, 1))
(3, 2)
>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)
(gh-17535)
random.Generator 类新增了一个permuted
函数。
这个新函数与shuffle
和permutation
不同之处在于,由轴索引的子数组被排列,而不是将轴视为每个其他索引组合的独立 1-D 数组。例如,现在可以对 2-D 数组的行或列进行排列。
(gh-15121)
sliding_window_view
为 numpy 数组提供了一个滑动窗口视图
numpy.lib.stride_tricks.sliding_window_view
构建了 numpy 数组上的视图,提供了对数组的滑动或移动窗口访问。这允许简单实现某些算法,例如运行均值。
(gh-17394)
numpy.broadcast_shapes
是一个新的面向用户的函数。
broadcast_shapes
从对抗给定的形状元组中广播得到结果形状。
>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)
>>> np.broadcast_shapes(2, (3, 1))
(3, 2)
>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)
(gh-17535)
弃用
使用np.int
之类的内置类型别名已被弃用
长期以来,np.int
一直是内置int
的别名。这常常让新手感到困惑,主要是出于历史原因。
这些别名已经被弃用。下表显示了所有已弃用别名的完整列表,以及它们的确切含义。将第一列中的项目替换为第二列的内容将产生相同效果,并消除弃用警告。
第三列列出了有时可能更优选的替代 NumPy 名称。另请参阅数据类型以获取更多详细信息。
弃用名称 | 相同于 | NumPy 标量类型名称 |
---|---|---|
numpy.bool |
bool |
numpy.bool_ |
numpy.int |
int |
numpy.int_ (默认),numpy.int64 或numpy.int32 |
numpy.float |
float |
numpy.float64 , numpy.float_ , numpy.double (equivalent) |
numpy.complex |
complex |
numpy.complex128 , numpy.complex_ , numpy.cdouble (equivalent) |
numpy.object |
object |
numpy.object_ |
numpy.str |
str |
numpy.str_ |
numpy.long |
int |
numpy.int_ (C long ), numpy.longlong (largest integer type) |
numpy.unicode |
str |
numpy.unicode_ |
对于绝大多数情况,对于bool
,object
,str
(和unicode
)类型,使用普通版本更短、更清晰,并且通常是一个良好的替代方案。对于float
和complex
,如果您希望更明确地表示精度,可以使用float64
和complex128
。
对于np.int
,直接使用np.int_
或int
作为替代都是可以的,不会改变行为,但精度会继续依赖于计算机和操作系统。如果您想更具体地检查当前使用情况,可以选择以下替代方案:
-
np.int64
或np.int32
以精确指定精度。这确保了结果不能依赖于计算机或操作系统。 -
np.int_
或int
(默认值),但要注意,这取决于计算机和操作系统。 -
C 类型:
np.cint
(int),np.int_
(long),np.longlong
。 -
np.intp
在 32 位机器上为 32 位,在 64 位机器上为 64 位。这可能是用于索引的最佳类型。
当与np.dtype(...)
或dtype=...
一起使用时,将其更改为上述 NumPy 名称不会对输出产生影响。如果用作标量:
np.float(123)
更改它可能会微妙地改变结果。在这种情况下,通常首选 Python 版本float(123)
或int(12.)
,尽管 NumPy 版本可能对于与 NumPy 数组保持一致性(例如,对于像除以零这样的事情,NumPy 的行为与之不同)可能是有用的。
(gh-14882)
向函数传递具有非可选形状参数的shape=None
是不被支持的
以前,这是传递shape=()
的别名。这种弃用是由 C API 中的PyArray_IntpConverter生成的。如果您的 API 旨在支持传递None
,那么在调用转换器之前,您应该先检查None
,以便能够区分None
和()
。
(gh-15886)
即使索引结果为空,索引错误也将被报告
将来,当整数数组索引包含超出边界值时,NumPy 将引发 IndexError,即使非索引维数的长度为 0。现在将发出 DeprecationWarning。此情况可能发生在数组先前为空时,或涉及空切片时:
arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]
以前,非空索引[20]
未被检查正确性。现在将被检查,导致弃用警告,这将转换为错误。这也适用于赋值。
(gh-15900)
mode
和searchside
的不精确匹配被弃用
以前,mode
和searchside
的不精确和不区分大小写的匹配是有效的输入,现在将产生 DeprecationWarning。例如,以下是现在已弃用并将产生 DeprecationWarning 的一些示例用法:
import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap") # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random') # should be "right"
(gh-16056)
numpy.dual的弃用
模块numpy.dual已被弃用。不要从numpy.dual导入函数,而应直接从 NumPy 或 SciPy 导入函数。
(gh-16156)
outer
和ufunc.outer
弃用了矩阵
np.matrix
与outer
或通用的 ufunc outer 调用(如numpy.add.outer
)一起使用。以前,在这里将矩阵转换为数组。将来不会再这样做,需要手动将矩阵转换为数组。
(gh-16232)
进一步弃用数字式样式类型
剩余的数字样式类型代码Bytes0
、Str0
、Uint32
、Uint64
和Datetime64
已经被弃用。应该改为使用小写变体。对于字节和字符串,"S"
和"U"
是进一步的替代方案。
(gh-16554)
ndindex
的ndincr
方法已被弃用
从 NumPy 1.8 起,文档已警告不要使用此函数。使用next(it)
代替it.ndincr()
。
(gh-17233)
不定义__len__
和__getitem__
的 ArrayLike 对象
定义了__array__
、__array_interface__
或__array_struct__
协议之一但不是序列(通常通过__len__
和__getitem__
定义)的对象在未来进行数组强制转换时会表现不同。
当嵌套在序列中时,例如np.array([array_like])
,它们被处理为单个 Python 对象而不是数组。将来它们将表现相同于:
np.array([np.array(array_like)])
这种变化只在np.array(array_like)
不为 0-D 时才会产生影响。对此警告的解决方案可能取决于对象:
-
一些类数组可能期望新行为,用户可以忽略警告。对象可以选择将序列协议公开以选择接受新行为。
-
例如,
shapely
将允许使用line.coords
而不是np.asarray(line)
来转换为类似数组的对象。用户可以解决警告,或者在新约定可用时使用新约定。
不幸的是,只有调用np.array(array_like)
才能实现新行为。
如果您希望确保旧行为保持不变,请创建一个对象数组,然后显式填充它,例如:
arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]
这将确保 NumPy 知道不进入类数组并将其用作对象。
(gh-17973)
使用np.int
等内置类型的别名是不推荐的
长期以来,np.int
一直是内置int
的别名。这反复是新手困惑的原因,主要是出于历史原因。
这些别名已经被弃用。下表显示了已弃用的别名的完整列表,以及它们的确切含义。使用第一栏中的项目的第二栏中的内容将会产生相同的效果并消除弃用警告。
第三栏列出了可能偶尔更优的替代 NumPy 名称。另请参阅数据类型以获取更多细节。
弃用名称 | 等同于 | NumPy 标量类型名称 |
---|---|---|
numpy.bool |
bool |
numpy.bool_ |
numpy.int |
int |
numpy.int_ (默认)、numpy.int64 或numpy.int32 |
numpy.float |
float |
numpy.float64 , numpy.float_ , numpy.double (equivalent) |
numpy.complex |
complex |
numpy.complex128 , numpy.complex_ , numpy.cdouble (equivalent) |
numpy.object |
object |
numpy.object_ |
numpy.str |
str |
numpy.str_ |
numpy.long |
int |
numpy.int_ (C long ), numpy.longlong (largest integer type) |
numpy.unicode |
str |
numpy.unicode_ |
对于绝大多数情况提供清晰的指导,对于类型bool
、object
、str
(和unicode
),使用简单版本更短、更清晰,通常是一个很好的替换。对于float
和complex
,如果您希望更明确地表达精度,可以使用float64
和complex128
。
对于np.int
,直接替换为np.int_
或int
也可以,不会改变行为,但精度仍然会取决于计算机和操作系统。如果您想更明确地查看当前使用情况,您有以下替代方案:
-
np.int64
或np.int32
来精确指定精度。这样可以确保结果不会依赖于计算机或操作系统。 -
np.int_
或int
(默认值),但请注意这取决于计算机和操作系统。 -
C 类型:
np.cint
(int),np.int_
(long),np.longlong
。 -
np.intp
在 32 位机器上为 32 位,在 64 位机器上为 64 位。这可能是用于索引的最佳类型。
当与np.dtype(...)
或dtype=...
一起使用时,将其更改为上述提到的 NumPy 名称对输出没有影响。如果作为标量使用:
np.float(123)
改变它可能会微妙地改变结果。在这种情况下,Python 版本float(123)
或int(12.)
通常更可取,尽管 NumPy 版本可能在与 NumPy 数组的一致性方面很有用(例如,对于诸如除零之类的操作,NumPy 的行为有所不同)。
(gh-14882)
将shape=None
传递给具有非可选 shape 参数的函数已被弃用
之前,这是传递 shape=()
的别名。 这种弃用是由 C API 中的 PyArray_IntpConverter 发出的。 如果你的 API 打算支持传递 None
,则应在调用转换器之前检查 None
,以区分 None
和 ()
。
(gh-15886)
即使索引结果为空,也将报告索引错误
未来,当整数数组索引包含超出范围值时,NumPy 将引发 IndexError,即使非索引维度的长度为 0。 现在将会发出弃用警告。 当数组之前为空或涉及空切片时可能会发生这种情况:
arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]
以前不会检查非空索引 [20]
的正确性。 现在将进行检查,从而引发弃用警告,并将其转换为错误。 对赋值也适用。
(gh-15900)
mode
和 searchside
的不精确匹配已被弃用
对于 mode
和 searchside
的不精确和不区分大小写的匹配以前是有效的,现在将会产生弃用警告。 例如,以下是一些现已被弃用并将产生弃用警告的示例用法:
import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap") # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random') # should be "right"
(gh-16056)
弃用了 numpy.dual
模块 numpy.dual 已弃用。 应该直接从 NumPy 或 SciPy 中导入函数,而不是从 numpy.dual 中导入。
(gh-16156)
outer
和 ufunc.outer
已弃用与矩阵相关的功能
np.matrix
与 outer
或 numpy.add.outer
等通用 ufunc 外部调用一起使用。 以前,这里的矩阵会被转换为数组。 未来将不再执行此操作,需要手动将矩阵转换为数组。
(gh-16232)
进一步弃用了数值风格类型
剩余的数值类型代码 Bytes0
、Str0
、Uint32
、Uint64
和 Datetime64
已弃用。 应改为使用小写变体。 对于字节和字符串,"S"
和 "U"
还是另选项。
(gh-16554)
ndindex
的 ndincr
方法已弃用
从 NumPy 1.8 开始,文档已经警告不要使用该函数。 对于 it.ndincr()
,应改为使用 next(it)
。
(gh-17233)
未定义 __len__
和 __getitem__
的 ArrayLike 对象
定义其中一个协议 __array__
、__array_interface__
或 __array_struct__
,但不是序列(通常通过具有 __len__
和 __getitem__
来定义)的对象,在数组强制转换期间将来会表现出不同的行为。
当嵌套在序列内部,比如 np.array([array_like])
,它们之前被处理为单个 Python 对象,而不是数组。 将来它们将表现为与以下完全相同的方式:
np.array([np.array(array_like)])
这个改变只会在np.array(array_like)
不是 0 维数组时发生作用。这个警告的解决方案可能取决于对象:
-
一些类似数组的对象可能期望新的行为,用户可以忽略警告。对象可以选择暴露序列协议以选择新的行为。
-
例如,
shapely
将允许使用line.coords
而不是np.asarray(line)
将其转换为类似数组的对象。用户可能会规避警告,或在可用时使用新约定。
不幸的是,只能通过调用np.array(array_like)
来使用新的行为。
如果您希望确保旧的行为保持不变,请创建一个对象数组,然后显式填充它,例如:
arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]
这将确保 NumPy 知道不要进入数组样式,而是将其作为对象使用。
(gh-17973)
未来的改变
数组不能使用子数组dtype
数组创建和转换将使用不同的逻辑,当dtype
是一个子数组dtype
时,如np.dtype("(2)i,")
。
对于这样的dtype
,以下行为是正确的:
res = np.array(arr, dtype)
res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape
但res
是依据以下逻辑填充的:
res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr
使用不正确的广播(并且通常会导致错误)。 以后,这将逐个元素转换,结果与以下相同:
res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]
正常情况下,可以用来选择新行为。
这个改变不会影响np.array(list, dtype="(2)i,")
,除非list
本身至少包含一个数组。特别地,对于元组列表,行为没有改变。
(gh-17596)
数组不能使用子数组dtype
数组创建和转换将使用不同的逻辑,当dtype
是一个子数组dtype
时,如np.dtype("(2)i,")
。
对于这样的dtype
,以下行为是正确的:
res = np.array(arr, dtype)
res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape
但res
是依据以下逻辑填充的:
res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr
使用不正确的广播(并且通常会导致错误)。 以后,这将逐个元素转换,结果与以下相同:
res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]
正常情况下,可以用来选择新行为。
这个改变不会影响np.array(list, dtype="(2)i,")
,除非list
本身至少包含一个数组。特别地,对于元组列表,行为没有改变。
(gh-17596)
过期的废弃
-
数字样式类型码
np.dtype("Complex64")
(使用大写拼写)的废弃期已过。"Complex64"
对应于"complex128"
,"Complex32"
对应于"complex64"
。 -
np.sctypeNA
和np.typeNA
的废弃期已过。二者已从公共 API 中删除。请改用np.typeDict
。(gh-16554)
-
np.ctypeslib.ctypes_load_library
的 14 年弃用期已到期。改用load_library
,它们是一样的。(gh-17116)
金融函数已移除
根据 NEP 32 的规定,NumPy 1.20 版已删除了金融函数。已删除的函数包括fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和rate
。这些函数可以在numpy_financial库中找到。
(gh-17067)
金融函数已移除
根据 NEP 32 的规定,NumPy 1.20 版已删除了金融函数。已删除的函数包括fv
、ipmt
、irr
、mirr
、nper
、npv
、pmt
、ppmt
、pv
和rate
。这些函数可以在numpy_financial库中找到。
(gh-17067)
兼容性说明
isinstance(dtype, np.dtype)
而不是type(dtype) is not np.dtype
NumPy dtypes 不再是np.dtype
的直接实例。可能使用了type(dtype) is np.dtype
的代码将始终返回False
,必须更新为使用正确的版本isinstance(dtype, np.dtype)
。
这个改变还影响了 C 端的宏PyArray_DescrCheck
,如果编译的 NumPy 版本旧于 1.16.6.如果代码使用此宏并希望编译为旧版本的 NumPy,必须替换该宏(另请参见 C API changes 部分)。
在与axis=None
连接时相同类型转换
当调用concatenate
时,如果带有axis=None
,则扁平数组将使用unsafe
进行类型转换。任何其他轴选择都使用“相同类型”。已弃用该不同的默认行为,将改为使用“相同类型”的类型转换。新的casting
关键字参数可用于保留旧的行为。
(gh-16134)
将 NumPy 标量添加到数组时进行类型转换
在创建或分配数组时,在所有相关情况下,NumPy 标量现在将被等同地转换为 NumPy 数组。特别是这会改变以前在某些情况下引发错误的行为:
np.array([np.float64(np.nan)], dtype=np.int64)
将会成功,并返回一个未定义的结果(通常是可能的最小整数)。这也影响了赋值:
arr[0] = np.float64(np.nan)
目前,NumPy 保留了以下行为:
np.array(np.float64(np.nan), dtype=np.int64)
以上更改不影响 Python 标量:
np.array([float("NaN")], dtype=np.int64)
不受影响(np.nan
是 Python 的float
,不是 NumPy 的)。与有符号整数不同,无符号整数不保留这种特殊情况,因为它们总是更像强制转换。以下代码不再引发错误:
np.array([np.float64(np.nan)], dtype=np.uint64)
为避免向后兼容性问题,此时仍支持从datetime64
标量到太短的字符串的赋值。这意味着现在可以成功执行np.asarray(np.datetime64("2020-10-10"), dtype="S5")
,而之前会失败。从长远来看,这可能会被弃用,或者允许不安全转换以使数组和标量的赋值行为保持一致。
当字符串和其他类型混合使用时,数组强制转换发生变化
当字符串和其他类型混合使用时,例如:
np.array(["string", np.float64(3.)], dtype="S")
结果将会改变,这可能会导致某些情况下字符串 dtype 的字符串更长。特别是,如果未提供dtype="S"
,任何数值都将导致一个足够长以容纳所有可能数值的字符串结果(例如,对于浮点数是“S32”)。请注意,当将非字符串转换为字符串时,应始终提供dtype="S"
。
如果提供了dtype="S"
,则结果将在很大程度上与以前相同,但 NumPy 标量(而不是 Python 浮点数,如1.0
)仍将强制统一字符串长度:
np.array([np.float64(3.)], dtype="S") # gives "S32"
np.array([3.0], dtype="S") # gives "S3"
以前的第一个版本产生了与第二个相同的结果。
数组转换重组
数组转换已经重组。一般情况下,这不应影响用户。在极为罕见的角落案例中,类数组对象被嵌套:
np.array([array_like1])
事情现在将更一致:
np.array([np.array(array_like1)])
这可能会微妙地改变某些糟糕定义的类数组的输出。其中一个例子是不匹配形状的类数组对象。在 NumPy 1.20 中,当一个类数组对象不是一个序列时会发出警告(但行为保持不变,请参阅弃用)。如果一个类数组对象也是一个序列(定义了__getitem__
和__len__
),NumPy 现在只会使用__array__
、__array_interface__
或__array_struct__
给出的结果。当(嵌套的)序列描述不同形状时,这将导致差异。
(gh-16200)
写入numpy.broadcast_arrays
的结果将导出只读缓冲区
在 NumPy 1.17 中,numpy.broadcast_arrays
在写入生成的数组时开始发出警告。当通过缓冲区接口使用数组时(例如memoryview(arr)
),此警告被跳过。现在,当两个协议__array_interface__
和__array_struct__
返回只读缓冲区时,将发生相同的情况,而不是发出警告。
(gh-16350)
数字风格的类型名称已从类型字典中移除
为了与对 np.dtype("Complex64")
和其他数值型(大写)类型的停用保持同步,这些类型已从 np.sctypeDict
和 np.typeDict
中移除。你应该使用小写版本。注意,"Complex64"
对应 "complex128"
,"Complex32"
对应 "complex64"
。numpy 风格(新)版本表示完整大小而不是实部/虚部的大小。
(gh-16554)
operator.concat
函数现在为数组参数引发 TypeError
以前的行为是退回到加法,并添加这两个数组,这被认为是一个不符合预期的行为对于一个连接函数。
(gh-16570)
nickname
属性从 ABCPolyBase 中移除
抽象属性 nickname
从 ABCPolyBase
中移除,因为在派生的方便类中不再使用。这可能会影响那些从 ABCPolyBase
派生类并覆盖了表示和显示方法的用户,例如 __str__
,__repr__
,_repr_latex
,等等。
(gh-16589)
float->timedelta
和 uint64->timedelta
增强现在会引发 TypeError
浮点数和时间增强现在一致地引发 TypeError。np.promote_types("float32", "m8")
现在与 np.promote_types("m8", "float32")
一致,并且都会引发 TypeError。以前,np.promote_types("float32", "m8")
返回 "m8"
,被认为是一个错误。
Uint64 和时间增强现在一致地引发 TypeError。np.promote_types("uint64", "m8")
现在与 np.promote_types("m8", "uint64")
一致,并且都会引发 TypeError。以前,np.promote_types("uint64", "m8")
返回 "m8"
,被认为是一个错误。
(gh-16592)
numpy.genfromtxt
现在正确地解包结构化数组
以前,numpy.genfromtxt
在使用unpack=True
并且在dtype
参数传递了结构化数据类型(或者推断了结构化数据类型为空)时无法正确解包。例如:
>>> data = StringIO("21 58.0\n35 72.0")
>>> np.genfromtxt(data, dtype=None, unpack=True)
array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])
现在结构化数组将正确解包为数组列表,每个列一个:
>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]
(gh-16650)
mgrid
,r_
等对于非默认精度输入一致地返回正确的输出
以前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]
和np.r_[0:10:np.complex64(3j)]
无法返回有意义的输出。 此错误可能影响到当使用默认的float64
和complex128
以及等效的 Python 类型以外的 dtype 时,mgrid
,ogrid
,r_
和c_
。 这些方法已修复以正确处理不同的精度。
(gh-16815)
具有不匹配形状的布尔数组索引现在会正确返回IndexError
以前,如果布尔数组索引与索引数组的大小匹配但形状不匹配,则在某些情况下会出现错误。 在其他情况下,它会出现一个错误,但错误消息不是IndexError
而是有关广播的ValueError
。
例如,以下不正确地给出了ValueError: operands could not be broadcast together with shapes (2,2) (1,4)
:
np.empty((2, 2))[np.array([[True, False, False, False]])]
以下不正确地返回了array([], dtype=float64)
:
np.empty((2, 2))[np.array([[False, False, False, False]])]
现在都正确返回IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1
。
(gh-17010)
转换错误中断迭代
当转换值时进行迭代,错误可能比以前更早地停止迭代。 在任何情况下,失败的转换操作总是返回未定义的部分结果。 对于使用NpyIter
C-API 的用户,这样的转换错误现在将导致iternext()函数返回 0,从而中断迭代。 目前,没有 API 直接检测此类错误。 必须检查PyErr_Occurred()
,这可能与NpyIter_Reset
结合使用会有问题。 这些问题一直存在,但如果用户需要,可以添加新的 API。
(gh-17029)
f2py 生成的代码可能返回 Unicode 而不是字节字符串
先前由 f2py 生成的代码返回的一些字节字符串现在可能是 Unicode 字符串。 这是由不断进行的 Python2 -> Python3 清理造成的。
(gh-17068)
__array_interface__["data"]
元组的第一个元素必须是整数
多年来,这一直是记录的接口,但仍然有代码会接受指针地址的字节字符串表示。 该代码已被移除,现在传递字节字符串作为地址将引发错误。
(gh-17241)
poly1d 尊重所有零参数的 dtype
以前,使用全零系数构造poly1d
的实例会将系数转换为np.float64
。这会影响内部构造poly1d
实例的方法的输出 dtype,比如np.polymul
。
(gh-17577)
swig 的 numpy.i 文件仅适用于 Python 3。
Python 2.7 C-API 函数的使用已更新为仅适用于 Python 3。需要旧版本的用户应该从旧版本的 NumPy 获取它。
(gh-17580)
在np.array
中发现虚 dtype
在使用np.array(..., dtype="V")
、arr.astype("V")
和类似方法时,现在将正确引发 TypeError,除非所有元素具有相同的虚长度。示例如下:
np.array([b"1", b"12"], dtype="V")
以前,返回的数组的 dtype 为"V2"
, 无法真实地表示b"1"
。
(gh-17706)
isinstance(dtype, np.dtype)
而不是type(dtype) is not np.dtype
NumPy dtypes 不再是np.dtype
的直接实例。可能使用了type(dtype) is np.dtype
的代码将始终返回False
,并且必须更新为使用正确的版本isinstance(dtype, np.dtype)
。
这个更改还影响了对 C 端宏PyArray_DescrCheck
的编译,如果编译的 NumPy 版本旧于 1.16.6. 如果代码使用了此宏,并希望针对旧版本的 NumPy 进行编译,它必须替换该宏(另见 C API changes 部分)。
与axis=None
连接时相同类型的转换
当用axis=None
调用concatenate
时,扁平化的数组将使用unsafe
进行类型转换。任何其他轴选择都使用“same kind”。不建议使用不同的默认设置,而是使用“same kind”转换。可以使用新的casting
关键字参数来保留旧的行为。
(gh-16134)
将赋给数组时,NumPy 标量将被转换
在创建或赋值数组时,在所有相关的情况下,NumPy 标量现在会被转换为 NumPy 数组。特别是这改变了以前引发错误的一些情况的行为:
np.array([np.float64(np.nan)], dtype=np.int64)
将成功并返回一个未定义的结果(通常是可能的最小整数)。这也影响了赋值:
arr[0] = np.float64(np.nan)
目前,NumPy 保留了以下行为:
np.array(np.float64(np.nan), dtype=np.int64)
上述更改不影响 Python 标量:
np.array([float("NaN")], dtype=np.int64)
保持不变(np.nan
是 Python 的float
,而不是 NumPy 的)。与有符号整数不同,无符号整数不保留此特殊情况,因为它们一直更像转换。以下代码不再引发错误:
np.array([np.float64(np.nan)], dtype=np.uint64)
为了避免向后兼容性问题,目前从datetime64
标量赋值给长度过短的字符串仍然是可行的。这意味着np.asarray(np.datetime64("2020-10-10"), dtype="S5")
现在能成功,而以前是失败的。从长远来看,这可能会被弃用,或者允许不安全的转换以使数组和标量的赋值行为一致。
当混合字符串和其他类型时,数组强制转换更改
当字符串和其他类型混合时,例如:
np.array(["string", np.float64(3.)], dtype="S")
结果将会改变,这可能会导致某些情况下长字符串的字符串数据类型。特别是,如果没有提供dtype="S"
,任何数值都将导致足够长的字符串结果,以容纳所有可能的数值(比如对于浮点数是“S32”)。请注意,当将非字符串转换为字符串时,应始终提供dtype="S"
。
如果提供了 dtype="S"
,结果将在很大程度上与以前相同,但 NumPy 标量(不是 Python 的浮点数,比如1.0
),仍将强制执行统一的字符串长度:
np.array([np.float64(3.)], dtype="S") # gives "S32"
np.array([3.0], dtype="S") # gives "S3"
以前的第一个版本给出了与第二个相同的结果。
数组强制转换重构
数组强制转换已经重新构建。一般情况下,这不应该影响用户。在极为罕见的角落情况中,数组样式被嵌套:
np.array([array_like1])
现在的情况将更加一致:
np.array([np.array(array_like1)])
这可能会微妙地改变一些糟糕定义的数组样式的输出。其中一个例子是不是序列的数组样式对象。在 NumPy 1.20 中,当一个类似数组的对象不是序列时会发出警告(但是行为保持不变,参见弃用)。如果一个类似数组的对象也是序列(定义了 __getitem__
和 __len__
),NumPy 现在将只使用__array__
、__array_interface__
或__array_struct__
给出的结果。当(嵌套的)序列描述不同的形状时,这将导致不同的结果。
(gh-16200)
对于 numpy.broadcast_arrays
的结果进行写入将导致只读缓冲区的导出。
在 NumPy 1.17 中,numpy.broadcast_arrays
在写入结果数组时开始发出警告。当通过缓冲区接口使用数组时(例如 memoryview(arr)
),该警告被跳过。现在两个协议__array_interface__
和__array_struct__
返回只读缓冲区而不是发出警告。
(gh-16350)
数值样式的类型名称已从类型字典中删除。
为了与np.dtype("Complex64")
和其他数字风格(大写)类型的弃用保持同步,这些类型已从np.sctypeDict
和np.typeDict
中移除。您应该改用小写版本。请注意,"Complex64"
对应于"complex128"
, "Complex32"
对应于"complex64"
。numpy 风格(新版本)的类型代表的是完整大小,而不是实部/虚部的大小。
(gh-16554)
operator.concat
函数现在对数组参数会引发 TypeError
之前的行为是退回到加法并添加两个数组,这被认为是一个连接函数的意外行为。
(gh-16570)
从 ABCPolyBase 中删除了nickname
属性
抽象属性nickname
已从ABCPolyBase
中移除,因为它在派生的便利类中不再使用。这可能会影响那些从ABCPolyBase
派生类并重写表示和显示方法(例如__str__
,__repr__
,_repr_latex
等)的用户。
(gh-16589)
float->timedelta
和uint64->timedelta
的提升都会引发 TypeError
浮点数和时间间隔一致提升会引发 TypeError。np.promote_types("float32", "m8")
现在和以前一样都会触发一个 TypeError。之前,np.promote_types("float32", "m8")
返回"m8"
被认为是一个 bug。
Uint64 和时间间隔的提升一致会引发 TypeError。np.promote_types("uint64", "m8")
现在和以前一样都会触发一个 TypeError。之前,np.promote_types("uint64", "m8")
返回"m8"
被认为是一个 bug。
(gh-16592)
numpy.genfromtxt
现在正确地解包结构化数组
之前,当以unpack=True
调用numpy.genfromtxt
,并且将结构化数据类型传递给dtype
参数(或者传递dtype=None
并且推断出结构化数据类型)时,numpy.genfromtxt
会失败解包。例如:
>>> data = StringIO("21 58.0\n35 72.0")
>>> np.genfromtxt(data, dtype=None, unpack=True)
array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])
结构化数组现在会正确地解包为一个数组列表,每列一个数组:
>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]
(gh-16650)
mgrid
,r_
等对于非默认精度输入一直返回正确的输出
以前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]
和 np.r_[0:10:np.complex64(3j)]
未能返回有意义的输出。这个错误可能会影响 mgrid
, ogrid
, r_
, 和 c_
在使用除默认的 float64
和 complex128
和对应的 Python 类型以外的精度输入时。方法已被修复以正确处理不同的精度。
(gh-16815)
具有不匹配形状的布尔数组索引现在会适当返回 IndexError
以前,如果布尔数组索引与索引数组的大小匹配但不能匹配形状,则在某些情况下会被错误地允许。在其他情况下,它会产生一个错误,但该错误是关于广播而不是正确的 IndexError
的错误 ValueError
。
例如,以下会不正确地返回 ValueError: operands could not be broadcast together with shapes (2,2) (1,4)
:
np.empty((2, 2))[np.array([[True, False, False, False]])]
以下会返回 array([], dtype=float64)
,之前是不正确的:
np.empty((2, 2))[np.array([[False, False, False, False]])]
现在都会适当返回 IndexError:布尔索引与维度 0 沿着相应的布尔维度是 1 的索引数组不匹配
(gh-17010)
抛出错误中断迭代
在进行值转换时进行迭代时,错误可能比以前更早地停止迭代。无论如何,失败的转换操作总是返回未定义的部分结果。现在这些可能会更加不确定和不完整。对于使用 NpyIter
C-API 的用户,这样的转换错误现在会导致 iternext() 函数返回 0,从而中止迭代。当前没有 API 直接检测此类错误。必须检查 PyErr_Occurred()
,这可能与 NpyIter_Reset
结合使用时会有问题。这些问题一直存在,但如果用户需要的话,可以添加新的 API。
(gh-17029)
f2py 生成的代码可能以 unicode 字符串而不是字节字符串返回
以前由 f2py 生成的代码返回的一些字节字符串现在可能是 Unicode 字符串。这是由于不断进行的 Python2 -> Python3 清理造成的。
(gh-17068)
__array_interface__["data"]
元组的第一个元素必须是整数
这已经是多年来的文档接口,但仍有代码会接受指针地址的字节字符串表示。现在已经删除了这些代码,以字节字符串传递地址现在会引发错误。
(gh-17241)
poly1d 会尊重全零参数的 dtype
以前,构造一个具有全零系数的 poly1d
实例将会将系数转换为 np.float64
。这将影响内部构造 poly1d
实例的方法的输出 dtype,例如 np.polymul
。
(gh-17577)
swig 的 numpy.i 文件仅适用于 Python 3。
Python 2.7 C-API 函数的使用已经更新为仅适用于 Python 3。需要旧版本的用户应该从旧版本的 NumPy 中获取它。
(gh-17580)
np.array
中的 void dtype 发现
在使用 np.array(..., dtype="V")
、arr.astype("V")
等调用中,除非所有元素具有相同的 void 长度,否则将会正确地引发 TypeError。例如:
np.array([b"1", b"12"], dtype="V")
以前返回的数组具有 dtype "V2"
,无法忠实地表示 b"1"
。
(gh-17706)
C API 更改
PyArray_DescrCheck
宏已经修改
自 NumPy 1.16.6 起,PyArray_DescrCheck
宏已经更新为:
#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)
从 NumPy 1.20 开始,针对较早版本编译的代码将与 NumPy 1.20 不兼容。修复方法为要么针对 1.16.6 编译(如果你希望支持的最旧版本为 NumPy 1.16),要么手动内联宏,并将其替换为新定义:
PyObject_TypeCheck(op, &PyArrayDescr_Type)
这样就与所有 NumPy 版本兼容。
np.ndarray
和 np.void_
的大小已经改变
PyArrayObject
和 PyVoidScalarObject
结构的大小已经改变。以下头文件定义已被移除:
#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))
由于大小不能被视为编译时常量:它将会因 NumPy 的不同运行时版本而发生变化。
最有可能相关的用法是在 C 中编写的潜在子类,必须重新编译并更新。有关详细信息,请参阅 PyArrayObject
的文档,并且如果你受到这项更改的影响,则请联系 NumPy 开发人员。
NumPy 将尝试给出一个优雅的错误,但是一个期望固定结构大小的程序可能会有未定义的行为,并且很可能会崩溃。
(gh-16938)
PyArray_DescrCheck
宏已经修改
自 NumPy 1.16.6 起,PyArray_DescrCheck
宏已经更新为:
#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)
从 NumPy 1.20 开始,针对较早版本编译的代码将与 NumPy 1.20 不兼容。修复方法为要么针对 1.16.6 编译(如果你希望支持的最旧版本为 NumPy 1.16),要么手动内联宏,并将其替换为新定义:
PyObject_TypeCheck(op, &PyArrayDescr_Type)
这样就与所有 NumPy 版本兼容。
np.ndarray
和 np.void_
的大小已经改变
PyArrayObject
和 PyVoidScalarObject
结构的大小已经改变。以下头文件定义已被移除:
#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))
由于大小不能被视为编译时常量:它将会因 NumPy 的不同运行时版本而发生变化。
最可能涉及的是以 C 编写的潜在子类,它们将需要重新编译并应进行更新。有关更多详细信息,请参阅 PyArrayObject
的文档,并在受此更改影响时与 NumPy 开发人员联系。
NumPy 将尝试给出一个优雅的错误,但是一个期望固定结构大小的程序可能会有未定义的行为,并可能崩溃。
(gh-16938)
新功能
where
关键字参数适用于 numpy.all
和 numpy.any
函数。
添加了关键字参数 where
,允许仅在 all
和 any
的布尔求值中考虑指定的元素或子轴。这个新关键字可在 numpy
直接使用或在 numpy.ndarray
的方法中使用。
任何可广播布尔数组或标量都可以设置为 where
。如果用户未设置 where
,它默认为 True
,用于对数组中的所有元素进行函数求值。示例可在函数的文档中找到。
where
关键字参数适用于 numpy
函数 mean
、std
、var
。
添加了关键字参数 where
,允许仅在计算 mean
、std
和 var
时限制作用范围至部分元素。它可以通过 numpy
直接使用,也可在 numpy.ndarray
的方法中使用。
任何可广播布尔数组或标量都可以设置为 where
。如果用户未设置 where
,它默认为 True
,用于对数组中的所有元素进行函数求值。示例可在函数的文档中找到。
(gh-15852)
norm=backward
、forward
关键字选项适用于 numpy.fft
函数。
添加了关键字参数选项 norm=backward
,它作为 None
的别名,并且充当默认选项;使用它会使直接变换不缩放,而逆变换缩放 1/n
。
使用新的关键字参数选项 norm=forward
会使直接变换缩放 1/n
,逆变换不缩放(即与默认选项 norm=backward
完全相反)。
(gh-16476)
NumPy 现在具有类型。
为 NumPy 的大部分内容添加了类型注解。还有一个新的 numpy.typing
模块,其中包含对终端用户有用的类型。目前可用的类型有
-
ArrayLike
:适用于可转换为数组的对象。 -
DtypeLike
:适用于可转换为 dtype 的对象。
(gh-16515)
在运行时可以访问 numpy.typing
。
现在可以在运行时导入 numpy.typing
中的类型。类似下面的代码现在可以正常工作:
from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]
(gh-16558)
对于由 f2py 生成的模块,新增了 __f2py_numpy_version__
属性。
由于 f2py 与 NumPy 一起发布,__f2py_numpy_version__
提供了追踪用于生成模块的 f2py 版本的方法。
(gh-16594)
通过 runtests.py 可以运行mypy
测试。
目前,配置 NumPy 存根运行 mypy 需要:
-
安装 NumPy
-
将源目录添加到 MYPYPATH 并链接到
mypy.ini
这两个选项都有点不方便,因此在 runtests 中添加一个--mypy
选项,可处理设置。这也对任何类型代码生成会很有用,因为它将确保在类型检查之前构建项目。
(gh-17123)
用户定义的 BLAS/LAPACK 检测顺序的否定
distutils
允许在确定 BLAS/LAPACK 库时否定库。这可用于从库解析阶段中删除项目,例如,可以这样禁止 NetLIB 库:
NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build
这将使用任何加速库。
(gh-17219)
允许将优化参数传递给 asv build
现在,在使用--bench-compare
参数时,可以向 ASV 构建传递-j
、--cpu-baseline
、--cpu-dispatch
和--disable-optimization
标志。
(gh-17284)
现在支持 NVIDIA HPC SDK nvfortran 编译器
支持 nvfortran 编译器,添加了 pgfortran 的版本。
(gh-17344)
为cov
和corrcoef
的dtype
选项
现在为numpy.cov
和numpy.corrcoef
提供了dtype
选项。该选项指定返回结果的数据类型。默认情况下,这些函数仍然返回一个numpy.float64
结果。
(gh-17456)
numpy.all
和numpy.any
函数的where
关键字参数
关键字参数where
被添加,允许在布尔运算中的all
和any
中仅考虑数组中的指定元素或子轴。这个新关键字可以通过numpy
的all
和any
函数直接使用,也可以在numpy.ndarray
的方法中使用。
任何可广播的布尔数组或标量都可以被设置为where
。如果用户未设置where
,那么默认为True
,以评估数组中的所有元素的函数。文档中提供了示例。
numpy
函数mean
、std
、var
的where
关键字参数
关键字参数where
被添加,允许将mean
、std
和var
的计算范围限制在元素的子集中。这个关键字既可以通过numpy
直接使用,也可以在numpy.ndarray
的方法中使用。
任何可广播的布尔数组或标量都可以设置为 where
。 如果用户没有设置 where
,则默认为 True
,以评估数组中所有元素的函数。 在函数的文档中给出了示例。
(gh-15852)
norm=backward
,forward
关键字选项用于 numpy.fft
函数
关键字参数选项 norm=backward
被添加为 None
的别名,并作为默认选项;使用它会直接将变换不缩放,反变换缩放为 1/n
。
使用新的关键字参数选项 norm=forward
会使直接变换缩放为 1/n
,而反变换不缩放(即与默认选项 norm=backward
完全相反)。
(gh-16476)
NumPy 现在是有类型的
对 NumPy 的大部分部分添加了类型注释。 还有一个新的 numpy.typing
模块,其中包含对最终用户有用的类型。 目前可用的类型是
-
ArrayLike
:对于可以强制转换为数组的对象 -
DtypeLike
:对于可以强制转换为 dtype 的对象
(gh-16515)
numpy.typing
可以在运行时访问
现在可以在运行时导入 numpy.typing
中的类型。 像下面的代码现在可以工作:
from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]
(gh-16558)
f2py 生成模块的新 __f2py_numpy_version__
属性。
因为 f2py 与 NumPy 一起发布,__f2py_numpy_version__
提供了一种跟踪 f2py 用于生成模块的版本的方式。
(gh-16594)
可以通过 runtests.py 运行 mypy
测试
当前运行带有 NumPy 存根配置的 mypy 需要:
-
安装 NumPy
-
将源目录添加到 MYPYPATH 并链接到
mypy.ini
两个选项都有点不方便,因此添加一个 --mypy
选项来运行测试,该选项可以处理设置。 这对于将来的任何类型代码生成也很有用,因为它将确保在类型检查之前构建项目。
(gh-17123)
用户定义的 BLAS/LAPACK 检测顺序的否定
distutils
允许在确定 BLAS/LAPACK 库时否定库。 这可以用于从库解析阶段中删除一个项目,即不允许使用 NetLIB 库可以这样做:
NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build
这将使用任何加速库之一。
(gh-17219)
允许将优化参数传递给 asv build
当使用 --bench-compare
参数时,现在可以向 ASV 构建传递 -j
,--cpu-baseline
,--cpu-dispatch
和 --disable-optimization
标志。
(gh-17284)
现在支持 NVIDIA HPC SDK nvfortran 编译器
支持 nvfortran 编译器,这是 pgfortran 的一个版本,已经添加。
(gh-17344)
cov
和 corrcoef
的 dtype
选项
numpy.cov
和 numpy.corrcoef
现在支持 dtype
选项。它指定返回结果应具有的数据类型。默认情况下,这些函数仍返回一个 numpy.float64
结果。
(gh-17456)
改进
提高多项式的字符串表示(__str__
)
所有六种多项式类型在 numpy.polynomial
中的字符串表示(__str__
)已更新为以数学表达式而不是系数数组来表示多项式。多项式表达式的包内格式可用 - 一种使用上下标的 Unicode 字符,另一种仅使用 ASCII 字符。
(gh-15666)
删除 Accelerate 库作为 LAPACK 库的候选项
Apple 不再支持 Accelerate。移除它。
(gh-15759)
包含多行对象的对象数组具有更可读的 repr
如果对象数组的元素包含换行符的 repr
,则包装的行将按列对齐。特别是,这改善了嵌套数组的 repr
:
>>> np.array([np.eye(2), np.eye(3)], dtype=object)
array([array([[1., 0.],
[0., 1.]]),
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])], dtype=object)
(gh-15997)
concatenate 支持提供输出 dtype
在 concatenate
中添加了通过关键字参数提供输出 dtype
和 casting
的支持。dtype
参数不能与 out
参数同时提供。
(gh-16134)
f2py 回调函数是线程安全的
f2py 中的回调函数现在是线程安全的。
(gh-16519)
numpy.core.records.fromfile
现在支持文件类对象。
numpy.rec.fromfile
现在可以使用文件类对象,例如 io.BytesIO
(gh-16675)
在 AIX 上添加了 distutils 的 RPATH 支持
这使得 SciPy 可以在 AIX 上构建。
(gh-16710)
使用命令行参数指定的 f90 编译器
Fortran Portland Group 编译器的编译器命令选择在 numpy.distutils.fcompiler
中已更改。这仅影响链接命令。这会强制使用命令行选项提供的可执行文件(如果提供的话),而不是 pgfortran 可执行文件。如果没有将可执行文件提供给命令行选项,则默认使用 pgf90 可执行文件,根据 PGI 文档,它是 pgfortran 的别名。
(gh-16730)
为 Cython 3.0 及更高版本添加了 NumPy 声明
Cython 3.0 的 pxd 声明得到改进,避免使用废弃的 NumPy C-API 功能。使用 Cython 3.0+ 构建的扩展模块现在可以设置 C 宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,以避免使用废弃的 API 而引起 C 编译器警告。
(gh-16986)
使窗口函数完全对称
确保 NumPy 提供的窗口函数是对称的。以前由于数值精度而出现对称性偏差,现在通过更好的计算排列避免了这种情况。
(gh-17195)
为多项式(__str__
)改进字符串表示
numpy.polynomial
中的全部六种多项式类型的字符串表示(__str__
)已更新,以给出多项式作为数学表达式,而不是系数数组。有两种全局格式可用于多项式表达式 - 一种使用上标和下标的 Unicode 字符,另一种仅使用 ASCII 字符。
(gh-15666)
移除 Accelerate 库作为 LAPACK 库的候选项
Apple 不再支持 Accelerate。移除它。
(gh-15759)
包含多行对象的对象数组具有更可读的repr
如果对象数组的元素具有包含换行符的 repr
,那么包装的行将按列对齐。显著地,这会改善嵌套数组的repr
。
>>> np.array([np.eye(2), np.eye(3)], dtype=object)
array([array([[1., 0.],
[0., 1.]]),
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])], dtype=object)
(gh-15997)
concatenate 支持提供输出 dtype
在concatenate
中添加了支持,以使用关键字参数提供输出 dtype
和 casting
。dtype
参数不能与out
同时提供。
(gh-16134)
线程安全的 f2py 回调函数
f2py 中的回调函数现在是线程安全的
(gh-16519)
numpy.core.records.fromfile
现在支持类文件对象
numpy.rec.fromfile
现在可以使用类文件的对象,例如io.BytesIO
(gh-16675)
在 AIX 上添加了对 distutils 的 RPATH 支持
这允许在 AIX 上构建 SciPy。
(gh-16710)
使用由命令行参数指定的 f90 编译器
更改 Fortran Portland Group Compiler 的编译器命令选择在numpy.distutils.fcompiler
中。这仅影响链接命令。这强制使用由命令行选项提供的可执行文件(如果提供)而不是 pgfortran 可执行文件。如果未向命令行选项提供可执行文件,则默认为 pgf90 可执行文件,这是根据 PGI 文档的别名。
(gh-16730)
为 Cython 3.0 及更高版本增加 NumPy 声明
对 Cython 3.0 的 pxd 声明进行了改进,以避免使用已弃用的 NumPy C-API 功能。使用 Cython 3.0+构建的扩展模块现在可以设置 C 宏NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,以避免有关已弃用 API 使用的 C 编译器警告。
(gh-16986)
使窗口函数完全对称
确保 NumPy 提供的窗口函数是对称的。以前由于数值精度而导致对称性的小偏差现在通过更好地安排计算而得以避免。
(gh-17195)
性能改进和更改
启用多平台 SIMD 编译器优化
为 NumPy 基础设施进行一系列改进,以为NEP-38铺平道路,摘要如下:
-
新建构建参数
-
--cpu-baseline
用于指定所需优化的最小集,默认值为min
,提供了可以安全运行在广泛用户平台上的最少 CPU 特性。 -
--cpu-dispatch
用于指定额外优化的分配集,默认值为max -xop -fma4
,它启用了除 AMD 传统特性外的所有 CPU 特性。 -
--disable-optimization
以明确禁用整个新的改进,它还添加了一个名为NPY_DISABLE_OPTIMIZATION
的新C编译器#定义,可以用作任何 SIMD 代码的守卫。
-
-
高级 CPU 分发器
基于 Python/Numpy distutils 架构的灵活跨架构 CPU 调度程序,支持所有常见编译器和广泛的 CPU 特性。
新的调度程序需要特殊的文件扩展名
*.dispatch.c
来标记可调度的C源。这些源代码有能力多次编译,这样每个编译过程都代表一定的 CPU 特性,并提供影响代码路径的不同#定义和标志。 -
新生成的自动生成的 C 头文件
core/src/common/_cpu_dispatch.h
该头文件是由 distutils 模块
ccompiler_opt
生成的,并包含所有通过命令参数‘–cpu-baseline’和‘–cpu-dispatch’配置的指令集的 #definitions 和 headers。 -
新的 C 头文件
core/src/common/npy_cpu_dispatch.h
该头文件包含了整个 CPU 调度过程所需的所有实用工具,它还可以被视为将新基础设施工作与 NumPy CPU 运行时检测连接起来的桥梁。
-
添加新属性到 NumPy umath 模块(Python 级别)
-
__cpu_baseline__
这是一个列表,包含了编译器和平台根据指定的值对命令参数‘–cpu-baseline’支持的最小一组所需优化。 -
__cpu_dispatch__
这是一个列表,包含了编译器和平台根据指定的值对命令参数‘–cpu-dispatch’支持的分派的一组额外优化。
-
-
在 PytestTester 运行时打印支持的 CPU 功能
(gh-13516)
启用多平台 SIMD 编译器优化
一系列针对 NumPy 基础设施的改进,为 NEP-38 铺平道路,总结如下:
-
新的构建参数
-
--cpu-baseline
用于指定所需优化的最小集合,默认值为min
,可安全运行在广泛用户平台上的最低 CPU 功能。 -
--cpu-dispatch
用于指定分派的一组额外优化,其默认值为max -xop -fma4
,这使得除 AMD 传统功能之外的所有 CPU 功能均可使用。 -
--disable-optimization
明确禁用所有新的改进,它还添加了一个名为NPY_DISABLE_OPTIMIZATION
的新 C 编译器 #definition,这可以作为任何 SIMD 代码的守卫。
-
-
高级 CPU 调度程序
基于 Python/Numpy distutils 构建的灵活的跨体系结构 CPU 调度程序,支持所有常见编译器,具有广泛的 CPU 功能。
新的调度程序需要特定的文件扩展名
*.dispatch.c
来标记可调度的 C 源文件。这些源文件有能力被多次编译,以便每次编译过程代表某些 CPU 功能,并提供影响代码路径的不同 #definitions 和 flags。 -
新的自动生成的 C 头文件
core/src/common/_cpu_dispatch.h
该头文件是由 distutils 模块
ccompiler_opt
生成的,并包含所有通过命令参数‘–cpu-baseline’和‘–cpu-dispatch’配置的指令集的 #definitions 和 headers。 -
新的 C 头文件
core/src/common/npy_cpu_dispatch.h
该头文件包含了整个 CPU 调度过程所需的所有实用工具,它还可以被视为将新基础设施工作与 NumPy CPU 运行时检测连接起来的桥梁。
-
添加新属性到 NumPy umath 模块(Python 级别)
-
__cpu_baseline__
列出了由命令参数‘–cpu-baseline’中指定的最小值来支持编译器和平台的所需优化的最小集。 -
__cpu_dispatch__
列出了由命令参数‘–cpu-dispatch’中指定的所支持的编译器和平台的附加优化的调度集。
-
-
运行 PytestTester 时打印支持的 CPU 功能
(gh-13516)
变更
更改 divmod(1., 0.)
及相关函数的行为
更改还确保了不同的编译器版本对这些操作中的 nan 或 inf 使用具有相同的行为。这以前取决于编译器,现在我们强制无效和除以零标志,使结果在不同编译器上相同。例如,gcc-5、gcc-8 或 gcc-9 现在会得到相同的行为。更改如下表所示:
新行为总结
运算符 | 旧警告 | 新警告 | 旧结果 | 新结果 | 在 MacOS 上有效 |
---|---|---|---|---|---|
np.divmod(1.0, 0.0) | 无效 | 无效 and 除以零 | nan、nan | inf、nan | 是 |
np.fmod(1.0, 0.0) | 无效 | 无效 | nan | nan | 不? 是 |
np.floor_divide(1.0, 0.0) | 无效 | 除以零 | nan | inf | 是 |
np.remainder(1.0, 0.0) | 无效 | 无效 | nan | nan | 是 |
(gh-16161)
np.linspace
在整数上现在使用 floor
当在 numpy.linspace
中使用 int
数据类型时,以前的浮点值会向零舍入。现在改为使用 numpy.floor
,它向 -inf
舍入。这会改变负数的结果。例如,以前的结果如下:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
现在的结果是:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1, 0, 1])
以前的结果仍然可以得到:
>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
(gh-16841)
更改 divmod(1., 0.)
及相关函数的行为
更改还确保了不同的编译器版本对这些操作中的 nan 或 inf 使用具有相同的行为。这以前取决于编译器,现在我们强制无效和除以零标志,使结果在不同编译器上相同。例如,gcc-5、gcc-8 或 gcc-9 现在会得到相同的行为。更改如下表所示:
新行为总结
运算符 | 旧警告 | 新警告 | 旧结果 | 新结果 | 在 MacOS 上有效 |
---|---|---|---|---|---|
np.divmod(1.0, 0.0) | 无效 | 无效 and 除以零 | nan、nan | inf、nan | 是 |
np.fmod(1.0, 0.0) | 无效 | 无效 | nan | nan | 不? 是 |
np.floor_divide(1.0, 0.0) | 无效 | 除以零 | nan | inf | 是 |
np.remainder(1.0, 0.0) | 无效 | 无效 | nan | nan | 是 |
(gh-16161)
np.linspace
在整数上现在使用 floor
当在numpy.linspace
中使用int
数据类型时,之前的浮点值会向零舍入。现在改为使用numpy.floor
,它会向-inf
舍入。这对负值的结果产生了变化。例如,之前的结果是:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
现在结果变为:
>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1, 0, 1])
仍然可以使用以下方法获得以前的结果:
>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1, 0, 0, 0, 1])
(gh-16841)
NumPy 1.19.5 发布说明
NumPy 1.19.5 是一个小的 bug 修复版本。除了修复了一些错误外,主要的改进是更新到了 OpenBLAS 0.3.13,在不中断其他平台执行的同时解决了 Windows 2004bug。此版本支持 Python 3.6-3.9,并计划是 1.19.x 循环中的最后一个版本。
贡献者
总共有 8 个人为此次发布做出了贡献。名字中带有“+”的人第一次为该补丁做出贡献。
-
Charles Harris
-
Christoph Gohlke
-
Matti Picus
-
Raghuveer Devulapalli
-
Sebastian Berg
-
Simon Graham +
-
Veniamin Petrenko +
-
Bernie Gray +
合并的拉取请求
本次发布合并了 11 个拉取请求。
-
#17756: BUG: 修复由于 floatstatus 超出界限指针而导致的 segfault…
-
#17774: BUG: 修复 np.timedelta64(‘nat’).format 引发异常的问题
-
#17775: BUG: 修复 array_tofile 中的文件句柄泄漏。
-
#17786: BUG: 在维度发现过程中引发递归错误
-
#17917: BUG: 修复在 fromfile 中使用过大计数的子数组数据类型
-
#17918: BUG: ‘bool’对象没有‘ndim’属性
-
#17919: BUG: 确保 _UFuncNoLoopError 可以被 pickled
-
#17924: BLD: 在 OpenBLAS 中使用 BUFFERSIZE=20
-
#18026: BLD: 更新至 OpenBLAS 0.3.13
-
#18036: BUG: 使变量易失性以解决 clang 编译器的错误
-
#18114: REL: 为 NumPy 1.19.5 版本做准备。
贡献者
总共有 8 个人为此次发布做出了贡献。名字中带有“+”的人第一次为该补丁做出贡献。
-
Charles Harris
-
Christoph Gohlke
-
Matti Picus
-
Raghuveer Devulapalli
-
Sebastian Berg
-
Simon Graham +
-
Veniamin Petrenko +
-
Bernie Gray +
合并的拉取请求
本次发布合并了 11 个拉取请求。
-
#17756: BUG: 修复由于 floatstatus 超出界限指针而导致的 segfault…
-
#17774: BUG: 修复 np.timedelta64(‘nat’).format 引发异常的问题
-
#17775: BUG: 修复 array_tofile 中的文件句柄泄漏。
-
#17786: BUG: 在维度发现过程中引发递归错误
-
#17917: BUG: 修复在 fromfile 中使用过大计数的子数组数据类型
-
#17918: BUG: ‘bool’对象没有‘ndim’属性
-
#17919: BUG: 确保 _UFuncNoLoopError 可以被 pickle 化
-
#17924: BLD: 在 OpenBLAS 中使用 BUFFERSIZE=20
-
#18026: BLD: 更新至 OpenBLAS 0.3.13
-
#18036: BUG: 使一个变量成为 volatile 以解决 clang 编译器的一个 bug
-
#18114: REL: 为 NumPy 1.19.5 版本做准备。
NumPy 1.19.4 发布说明
NumPy 1.19.4 是一个快速发布版本,用于还原 OpenBLAS 库的版本。希望在 1.19.3 中使用的 0.3.12 OpenBLAS 版本能解决 Microsoft fmod bug 的问题,但在某些 Docker 环境中出现了问题。相反,1.19.4 将使用旧库并在导入时运行健全性检查,如果检测到问题,将引发错误。Microsoft 已意识到了这个问题,并承诺在修复后,用户应升级。
此版本支持 Python 3.6-3.9
贡献者
共有 1 人贡献了此版本。有人名字旁有“+”符号的为首次贡献补丁的人。
- 查尔斯·哈里斯
已合并的拉取请求
共有 2 个拉取请求已合并到此版本。
贡献者
共有 1 人贡献了此版本。有人名字旁有“+”符号的为首次贡献补丁的人。
- 查尔斯·哈里斯
已合并的拉取请求
共有 2 个拉取请求已合并到此版本。
NumPy 1.19.3 发布说明
NumPy 1.19.3 是一个小型维护版本,有两个主要改进:
-
所有受支持平台上的 Python 3.9 二进制轮子。
-
针对 Windows 10 2004 版本 fmod bug 的 OpenBLAS 修复。
这个版本支持 Python 3.6-3.9,并且链接了 OpenBLAS 0.3.12 以避免在 Windows 10 2004 版本上的一些 fmod 问题。微软已经意识到了这个问题,用户应该在修复可用时升级,这里的修复范围有限。
贡献者
这个版本共有 8 人为其做出了贡献。名字后带“+”符号的人员是首次贡献补丁的。
-
Charles Harris
-
Chris Brown +
-
Daniel Vanzo +
-
- Madison Bray +
-
Hugo van Kemenade +
-
Ralf Gommers
-
Sebastian Berg
-
@danbeibei +
合并的拉取请求
这个版本共合并了 10 个拉取请求。
-
#17298: 构建: 为构建依赖设置上限版本
-
#17336: 修复: 在 PyArray_InitArrFuncs 中将已弃用字段设为 null
-
#17446: 增强: 警告不支持的 Python 3.10+
-
#17450: 维护: 更新 test_requirements.txt。
-
#17522: 增强: 支持 NVIDIA HPC SDK nvfortran 编译器
-
#17568: 修复: 受影响平台上的 Cygwin 对 #14787 的回避方法
-
#17647: 修复: 由于放宽步幅导致的缓冲区信息缓存内存泄漏
-
#17652: 维护: 从主分支回溯 openblas_support。
-
#17653: 测试: 在 Windows、Mac 上将 Python 3.9 添加到 CI 测试。
-
#17660: 测试: 简化 test_extending 中的源路径名称。
贡献者
这个版本共有 8 人为其做出了贡献。名字后带“+”符号的人员是首次贡献补丁的。
-
Charles Harris
-
Chris Brown +
-
Daniel Vanzo +
-
- Madison Bray +
-
Hugo van Kemenade +
-
Ralf Gommers
-
Sebastian Berg
-
@danbeibei +
合并的拉取请求
这个版本共合并了 10 个拉取请求。
-
#17298: 构建: 为构建依赖设置上限版本
-
#17336: 修复: 在 PyArray_InitArrFuncs 中将已弃用字段设为 null
-
#17446: 增强: 警告不支持的 Python 3.10+
-
#17450: 维护: 更新 test_requirements.txt。
-
#17522: 增强: 支持 NVIDIA HPC SDK nvfortran 编译器
-
#17568: 修复: 受影响平台上的 Cygwin 对 #14787 的回避方法
-
#17647: BUG: 修复因放松步幅而导致的缓冲区信息缓存内存泄漏。
-
#17652: MAINT: 从主分支中回溯 openblas_support。
-
#17653: TST: 在 Windows、Mac 上的 CI 测试中添加 Python 3.9。
-
#17660: TST: 简化 test_extending 中的源路径名称。
NumPy 1.19.2 发布说明
NumPy 1.19.2 修复了几个 bug,为即将到来的 Cython 3.x 版本做准备,并固定 setuptools,以便在上游修改正在进行时仍让 distutils 工作。aarch64 轮子是使用最新的 manylinux2014 发行版构建的,解决了不同 Linux 发行版使用不同页面大小的问题。
本发布版支持 Python 3.6-3.8。在使用 Python 3.9 进行测试时,需要使用 Cython >= 0.29.21。
我们正在努力排查 Windows 10 版本=2004 和 OpenBLAS svd 存在的已知问题。如果你使用的是该版本的 Windows,你应该使用链接到 MKL 库的 NumPy 版本,较早版本的 Windows 则没有问题。
改进
为 Cython 3.0 及更高版本添加 NumPy 声明
改进了 Cython 3.0 版本的 pxd 声明,避免使用已弃用的 NumPy C-API 特性。现在,使用 NumPy 的 Cython 3.0+ 构建的扩展模块可以设置 C 宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,避免 C 编译器对已弃用 API 用法的警告。
贡献者
本发布版共有 8 位贡献者。名字后面带有“+”的人首次贡献了一个补丁。
-
Charles Harris
-
Matti Picus
-
Pauli Virtanen
-
Philippe Ombredanne +
-
Sebastian Berg
-
Stefan Behnel +
-
Stephan Loyd +
-
Zac Hatfield-Dodds
已合并的拉取请求
本发布版共合并了 9 个拉取请求。
-
#16959: 测试: 在 travis.yml 中将 aarch64 改为 arm64
-
#16998: 维护: 为
np.test()
配置假设以确保确定性,… -
#17000: 构建: pin setuptools < 49.2.0
-
#17015: 增强: 为 Cython 3.0+ 添加可用的 NumPy 声明
-
#17125: BUG: 修复 fft 计算中非线程安全的 sigint 处理
-
#17243: BUG: core: 修复 ilp64 blas dot/vdot/… 在 strides > int32 max 时的问题
-
#17244: 文档: 使用正确的许可证的 SPDX 许可证表达式
-
#17245: 文档: 修复旧 API 函数中对快速入门的链接
-
#17272: BUG: 修复大于 2GiB 的数组的 pickle
改进
为 Cython 3.0 及更高版本添加 NumPy 声明
改进了 Cython 3.0 版本的 pxd 声明,避免使用已弃用的 NumPy C-API 特性。现在,使用 NumPy 的 Cython 3.0+ 构建的扩展模块可以设置 C 宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,避免 C 编译器对已弃用 API 用法的警告。
为 Cython 3.0 及更高版本添加 NumPy 声明
为了避免使用已弃用的 NumPy C-API 特性,Cython 3.0 的 pxd 声明得到了改进。现在,使用 Cython 3.0+构建的扩展模块可以设置 C 宏NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION
,以避免关于使用已弃用 API 的 C 编译器警告。
贡献者
总共有 8 个人为此版本做出了贡献。在其名字后带有“+”的人第一次为补丁做出了贡献。
-
Charles Harris
-
Matti Picus
-
Pauli Virtanen
-
Philippe Ombredanne +
-
Sebastian Berg
-
Stefan Behnel +
-
Stephan Loyd +
-
Zac Hatfield-Dodds
合并的拉取请求
总共有 9 个拉取请求被合并到此版本。
-
#16959: 测试:在 travis.yml 中将 aarch64 更改为 arm64。
-
#16998: 维护:在
np.test()
中配置假设(hypothesis)以实现确定性,… -
#17000: 构建:设置 setuptools<49.2.0 的版本
-
#17015: 增强:为 Cython 3.0+添加 NumPy 声明
-
#17125: 错误修复:从 fft 计算中删除不线程安全的 sigint 处理
-
#17243: 错误修复:核心:修复 strides > int32 max 时的 ilp64 blas dot/vdot/…
-
#17244: 文档:使用正确的许可 SPDX 许可表达式
-
#17245: 文档:修复旧 API 函数中快速启动的链接
-
#17272: 错误修复:修复大于 2GiB 的数组的 pickling
NumPy 1.19.1 发布说明
NumPy 1.19.1 修复了 1.19.0 发布中发现的几个 bug,替换了即将在 Python 3.9 发布中弃用的几个函数,改进了对 AIX 的支持,并做了一些开发相关的更新以维持与最近上游更改的持续集成(CI)的工作。
本次发布支持 Python 3.6-3.8。测试时需要使用 Python 3.9 构建时需使用 Cython >= 0.29.21。
Contributors
本次发布有 15 人做出了贡献。其中名字后面带有“+”的是首次贡献补丁的人。
-
Abhinav Reddy +
-
Anirudh Subramanian
-
Antonio Larrosa +
-
Charles Harris
-
Chunlin Fang
-
Eric Wieser
-
Etienne Guesnet +
-
Kevin Sheppard
-
Matti Picus
-
Raghuveer Devulapalli
-
Roman Yurchak
-
Ross Barnowski
-
Sayed Adel
-
Sebastian Berg
-
Tyler Reddy
合并的拉取请求
本次发布合并了共计 25 个拉取请求。
-
#16649: MAINT, CI: 禁用 Shippable cache
-
#16652: MAINT: 用 PyUnicode_GetLength 替换 PyUString_GET_SIZE。
-
#16654: REL: 修复过时的文档链接
-
#16656: BUG: 在 AIX 上引发 IEEE 异常
-
#16672: BUG: 修复处理数组时 AVX 复数绝对值中的 bug
-
#16693: TST: 在 CPU 功能检测中添加额外的调试信息
-
#16703: BLD: 为 Emscripten / WebAssembly 添加 CPU 条目
-
#16705: TST: 禁用 Python 3.9-dev 测试。
-
#16714: MAINT: 在 ValueError 情况下禁用 use_hugepages
-
#16724: BUG: 修复 PyArray_SearchSorted 的签名。
-
#16768: MAINT: 修复 scalartypes.c.src 中的弃用函数
-
#16772: MAINT: 移除不必要的对 PyUnicode_READY 的调用
-
#16776: MAINT: 修复 scalarapi.c 中的弃用函数
-
#16779: BLD, ENH: 为 AIX 添加 RPATH 支持
-
#16780: BUG: 修复 genfromtxt 中的默认回退
-
#16784: BUG: 在 methods.c 中引发错误后添加了丢失的返回
-
#16795: BLD: 更新 cython 至 0.29.21
-
#16832: MAINT: setuptools 49.2.0 产生警告,避免它
-
#16872: BUG: 验证二项式和多项式输出大小
-
#16875: BLD, MAINT: 固定 setuptools 版本
-
#16904: DOC:重构测试指南。
-
#16905: TST, BUG:在 test_large_zip 中重新引发 MemoryError 异常的例外
-
#16906: BUG,DOC:修复错误的 MPL 参数。
-
#16916: BUG:修复字符串/字节到复数赋值
-
#16922: REL:准备 NumPy 1.19.1 版本发布
贡献者
本次发布共有 15 人做出贡献。名字后面有“+”的人第一次为此发布贡献了补丁。
-
Abhinav Reddy +
-
Anirudh Subramanian
-
Antonio Larrosa +
-
Charles Harris
-
Chunlin Fang
-
Eric Wieser
-
Etienne Guesnet +
-
Kevin Sheppard
-
Matti Picus
-
Raghuveer Devulapalli
-
Roman Yurchak
-
Ross Barnowski
-
Sayed Adel
-
Sebastian Berg
-
Tyler Reddy
已合并的拉取请求
本次发布共合并了 25 个拉取请求。
-
#16649: MAINT, CI:禁用 Shippable 缓存
-
#16652: MAINT:用PyUnicode_GetLength代替PyUString_GET_SIZE。
-
#16654: REL:修复过时的文档链接
-
#16656: BUG:在 AIX 上引发 IEEE 异常
-
#16672: BUG:在处理数组时修复 AVX 复数绝对值中的错误...
-
#16693: TST:在 CPU 特性检测中添加额外的调试信息
-
#16703: BLD:为 Emscripten/WebAssembly 添加 CPU 输入
-
#16705: TST:禁用 Python 3.9-dev 测试。
-
#16714: MAINT:在出现 ValueError 情况下禁用 use_hugepages
-
#16724: BUG:修复 PyArray_SearchSorted 签名。
-
#16768: MAINT:在 scalartypes.c.src 中修复了已弃用函数
-
#16772: MAINT:删除不需要的 PyUnicode_READY 调用
-
#16776: MAINT:在 scalarapi.c 中修复已弃用的函数
-
#16779: BLD, ENH:为 AIX 添加 RPATH 支持
-
#16780: BUG:修复 genfromtxt 中默认的回退
-
#16784: BUG:在 methods.c 中引发错误后添加丢失的返回
-
#16795: BLD:更新 cython 至 0.29.21
-
#16832: MAINT:setuptools 49.2.0 发出警告,避免它
-
#16872: BUG:验证二项式和多项式输出大小
-
#16875: BLD, MAINT:固定 setuptools 版本
-
#16904: DOC:重构测试指南。
-
#16905: TST, BUG: 在 test_large_zip 中重新引发 MemoryError 异常...
-
#16906: BUG,DOC: 修复坏的 MPL kwarg.
-
#16916: BUG: 修复字符串/字节到复数的赋值
-
#16922: REL: 为准备 NumPy 1.19.1 版本发布做准备
NumPy 1.19.0 发布说明
这个 NumPy 版本以大量技术债务的清除为标志:不再支持 Python 2,许多弃用的功能已经过期,并且文档得到了改进。 对随机模块的优化持续进行中,包括来自 Cython 的错误修复和更好的可用性。
本版本支持的 Python 版本为 3.6-3.8。 下游开发人员应该使用 Cython >= 0.29.16 来支持 Python 3.8,并且在 Skylake 架构上避免使用 OpenBLAS >= 3.7 出现问题。
亮点
-
代码与 Python 版本 < 3.6(包括 Python 2)的兼容性已从 python 和 C 代码中删除。
numpy.compat
中的兼容层将继续支持第三方包,但可能会在将来的版本中被弃用。 请注意,由于使用了 f-strings,1.19.x 不会与早期版本的 Python 编译。(gh-15233)
弃用已过期
numpy.insert
和 numpy.delete
在 0d 数组上不能再传递 axis。
这标志着从 1.9 开始的弃用,当axis
参数传递给 0d 数组的~numpy.insert
和~numpy.delete
调用时,axis
和obj
参数以及索引将被完全忽略。 在这些情况下,insert(arr, "nonsense", 42, axis=0)
实际上会覆盖整个数组,而delete(arr, "nonsense", axis=0)
将是arr.copy()
现在在 0d 数组上传递axis
会引发~numpy.AxisError
。
(gh-15802)
numpy.delete
不再忽略超出范围的索引
这标志着从 1.8 和 1.9 开始的弃用,其中 np.delete
将忽略负数和超出范围的索引。 这与将单个索引传递时的行为相矛盾。
现在超出范围的项会抛出 IndexError
,负数项从末尾索引。
(gh-15804)
numpy.insert
和 numpy.delete
不再接受非整数索引
这结束了从 1.9 开始的弃用,允许非整数索引序列并将其转换为整数。 现在传递非整数索引的序列会引发 IndexError
,就像传递单个非整数标量时一样。
(gh-15805)
numpy.delete
不再将布尔索引转换为整数
这结束了从 1.8 开始的弃用,np.delete
将布尔数组和标量转换为整数索引。 现在的行为是将布尔数组视为掩码,并在布尔标量上引发错误。
(gh-15815)
兼容性说明
从numpy.random.Generator.dirichlet
更改随机变量流
通过在max(alpha) < 0.1
时使用不同的算法,修复了对 Dirichlet 分布的小“alpha”值的随机变量生成中的错误。由于更改,此情况下由dirichlet
生成的变量流将与先前的版本不同。
(gh-14924)
在PyArray_ConvertToCommonType
中的标量提升
混合标量和数组在PyArray_ConvertToCommonType
中的提升已更改为遵循np.result_type
使用的规则。这意味着类似(1000, np.array([1], dtype=np.uint8)))
的输入现在将返回uint16
数据类型。在大多数情况下,这不会改变行为。请注意,通常不建议使用此 C-API 函数。这也修复了np.choose
在这方面与 NumPy 的其他部分的行为相同。
(gh-14933)
Fasttake 和 fastputmask 插槽已经被弃用并且设为 NULL
现在永远不会使用 fasttake 和 fastputmask 插槽,必须始终设置为 NULL。这不会导致行为上的任何改变。但是,如果用户 dtype 应该设置其中之一,将会给出 DeprecationWarning。
(gh-14942)
np.ediff1d
通过使用 to_end
和 to_begin
参数的转换行为
np.ediff1d
现在对其额外的to_end
和to_begin
参数使用"same_kind"
转换规则。这确保了除非输入数组的整数类型小于to_begin
或to_end
,否则会遵循类型安全性。在少数情况下,行为将比 1.16 和 1.17 中以前更严格。这是解决浮点 NaN 问题所必需的。
(gh-14981)
将空数组对象转换为 NumPy 数组
实现len(obj) == 0
并且实现“数组样式”接口的对象(即实现 obj.__array__()
, obj.__array_interface__
, obj.__array_struct__
或 Python buffer 接口的对象,并且也是序列(即 Pandas 对象)),当转换为数组时,现在将始终正确地保留其形状。如果此类对象先前的形状为(0, 1)
,则可以转换为形状为(0,)
的数组(在第一个 0 后丢失所有维度)。
(gh-14995)
移除 multiarray.int_asbuffer
作为持续删除 Python 2 兼容性的一部分,移除了 multiarray.int_asbuffer
。在 Python 3 上,它抛出了一个 NotImplementedError
并在内部未使用。预计在 Python 3 中不会有使用此方法的下游用例。
(gh-15229)
已移除 numpy.distutils.compat
该模块仅包含一个名为 get_exception()
的函数,用法如下:
try:
...
except Exception:
e = get_exception()
其目的是处理在 Python 2.6 中引入的语法更改,即从except Exception, e:
到except Exception as e:
,这意味着它仅适用于支持 Python 2.5 及更早版本的代码库。
(gh-15255)
issubdtype
不再将float
解释为np.floating
。
numpy.issubdtype
自 NumPy 1.14 以来就有一个过期的FutureWarning
。这意味着某些输入,其中第二个参数既不是数据类型也不是 NumPy 标量类型(例如字符串或像int
或float
这样的 python 类型),现在将与传入np.dtype(arg2).type
保持一致。这使结果符合预期,并在某些以前返回true
的情况下导致错误的结果。
(gh-15773)
更改标量的round
的输出,以使其与 Python 一致
__round__
特殊方法的输出以及因此 Python 内置的round
已更改为 Python int
,以使其与在未传递参数时调用 Python float
对象时的调用一致。以前,它会返回传入的np.dtype
的标量。
(gh-15840)
numpy.ndarray
构造函数不再将strides=()
解释为strides=None
。
前者已更改为将numpy.ndarray.strides
设置为()
的预期含义,而后者继续自动选择步幅。
(gh-15882)
C 级别的字符串到日期时间的转换发生了变化
C 级别的从字符串到数据类型的转换被简化。这一变更也修复了字符串到日期时间和时间差的转换,使其行为正确(即像 Python 转换一样使用string_arr.astype("M8")
,而先前的转换会像string_arr.astype(np.int_).astype("M8")
一样)。这只影响使用低级 C-API 进行手动转换(而不是完整数组转换)的代码,单个标量值或使用PyArray_GetCastFunc
,因此不应影响绝大多数用户。
(gh-16068)
具有小种子的SeedSequence
不再与生成冲突
较小的种子(小于2**96
)以前被隐式地填充为 128 位,即内部熵池的大小。在生成时,生成密钥在填充 0 之前进行连接。由于第一个生成密钥是(0,)
,在生成之前的小种子将创建与第一个生成的SeedSequence
相同的状态。现在,种子在显式填充到内部池大小之前进行填充 0,然后连接生成密钥。生成的SeedSequences
将产生与先前版本不同的结果。未生成的SeedSequences
仍然会产生相同的结果。
(gh-16551)
弃用
弃用对不规则输入的自动dtype=object
调用np.array([[1, [1, 2, 3]])
将根据NEP 34发出DeprecationWarning
。用户应明确使用dtype=object
以避免警告。
(gh-15119)
在numpy.rec
的工厂函数中传递shape=0
已弃用。
0
在以下函数中被看作是一个特殊情况,并被别名为 None
:
-
numpy.core.records.fromarrays
-
numpy.core.records.fromrecords
-
numpy.core.records.fromstring
-
numpy.core.records.fromfile
未来,0
将不再特殊处理,而会像任何其他整数一样被视为数组长度。
(gh-15217)
废弃了可能未被使用的 C-API 函数
以下 C-API 函数可能未被使用,已经被废弃:
-
PyArray_GetArrayParamsFromObject
-
PyUFunc_GenericFunction
-
PyUFunc_SetUsesArraysAsData
在大多数情况下,应该通过转换为数组来替换 PyArray_GetArrayParamsFromObject
,而 PyUFunc_GenericFunction
可以用 PyObject_Call
来替换(详见文档)。
(gh-15427)
转换特定类型到 dtypes 被废弃
标量类型的超类,例如 np.integer
、np.generic
或 np.inexact
,在转换为 dtype(或在 dtype 关键字参数中使用)时,现在会发出废弃警告。原因是 np.integer
被转换为 np.int_
,而人们期望其代表 任何 整型(例如也包括 int8
、int16
等)。例如,dtype=np.floating
当前与 dtype=np.float64
相同,即使 np.float32
也是 np.floating
的子类。
(gh-15534)
废弃了 np.complexfloating
标量的 round
__round__
傻帽方法以及因此而废弃的 Python 内建方法 round
在复数标量上。这不会影响 np.round
。
(gh-15840)
numpy.ndarray.tostring()
被废弃,建议使用 tobytes()
~numpy.ndarray.tobytes
这个函数自 1.9 版本开始就存在了,但直到这个版本之前,~numpy.ndarray.tostring
不会发出任何警告。发出警告的改变使得 NumPy 与同名的内建 array.array
方法达到了一致。
(gh-15867)
C API 的变更
对 API 函数中的 const
维度提供更好的支持
以下函数现在接受一个 npy_intp
的常量数组:
-
PyArray_BroadcastToShape
-
PyArray_IntTupleFromIntp
-
PyArray_OverflowMultiplyList
之前的调用者需要强制取消常量性来调用这些函数。
(gh-15251)
修饰 UFunc 的内循环
UFuncGenericFunction
现在期望指向常量 dimension
和 strides
的指针作为参数。这意味着内循环可能不能再修改 dimension
或 strides
。这个改变会导致 incompatible-pointer-types
警告,强制用户要么忽略编译器警告,要么修饰自己循环的签名以添加 const 限定符。
(gh-15355)
新特性
现在 numpy.frompyfunc
接受一个 identity 参数
这允许在生成的 ufunc 上设置numpy.ufunc.reduce
,意味着它可以用于空调用和多维调用。
(gh-8255)
np.str_
标量现在支持缓冲区协议。
np.str_
数组始终以 UCS4 存储,因此相应的标量现在通过缓冲区接口公开这一点,这意味着memoryview(np.str_('test'))
现在可以使用。
(gh-15385)
为numpy.copy
添加了subok
选项。
在numpy.copy
中添加了一个新的关键字参数subok
,允许用户切换numpy.copy
对于数组子类的行为。默认值为False
,这与以前 numpy 版本中numpy.copy
的行为一致。要保留数组子类的numpy.copy
的副本,调用np.copy(arr, subok=True)
。这个添加更好地记录了numpy.copy
的默认行为与numpy.ndarray.copy
方法不同,后者默认情况下会保留数组子类。
(gh-15685)
numpy.linalg.multi_dot
现在接受out
参数。
out
可以用来避免创建numpy.linalg.multidot
计算的最终产品的不必要副本。
(gh-15715)
numpy.count_nonzero
的keepdims
参数。
numpy.count_nonzero
添加了参数keepdims
,参数与numpy.sum
或numpy.mean
等缩减函数中的含义相同。
(gh-15870)
numpy.array_equal
的equal_nan
参数。
numpy.array_equal
添加了关键字参数equal_nan
。 equal_nan
是一个布尔值,用于切换比较中是否认为nan
值相等(默认为False
)。这与numpy.isclose
和numpy.allclose
等相关函数中使用的 API 相匹配。
(gh-16128)
改进
改进 CPU 功能的检测。
用更通用的函数npy_cpu_init
和npy_cpu_have
替换了之前特定于 gcc 的npy_cpu_supports
机制,以测试 AVX 的支持,并通过NPY_CPU_HAVE
c 宏以及 Python 级别的__cpu_features__
字典公开结果。
(gh-13421)
在后备 lapack_lite 中在 64 位平台上使用 64 位整数大小。
在 64 位平台上使用 64 位整数大小作为后备的 LAPACK 库,当系统没有安装 LAPACK 时,它可以处理大型数组的线性代数。
(gh-15218)
在输入为np.float64
时,使用 AVX512 内在函数来实现np.exp
。
当输入为 np.float64
时,使用 AVX512 内在函数来实现 np.exp
,可以使得 np.float64
输入的 np.exp
性能提升 5-7 倍。在 linux64 上,_multiarray_umath.so
模块约增加了 63 KB。
(gh-15648)
禁用 madvise 巨大页的能力
在 Linux 上,NumPy 以前已经增加了对 madavise 巨大页的支持,这可以改善非常大的数组的性能。不幸的是,在旧版本的内核上,这导致性能回退,因此默认情况下在 4.6 版本之前的内核上已禁用支持。要覆盖默认值,您可以使用环境变量:
NUMPY_MADVISE_HUGEPAGE=0
或者将其设置为 1 以强制启用支持。请注意,只有在操作系统设置为使用 madvise 透明巨大页时才会有区别。
(gh-15769)
numpy.einsum
接受 NumPy int64
类型的下标列表
当 numpy.einsum
被传递 NumPy int64
数组作为它的下标列表时,不再抛出类型错误。
(gh-16080)
np.logaddexp2.identity
更改为 -inf
~numpy.logaddexp2
现在的身份为 -inf
,允许在空序列上调用它。这与 ~numpy.logaddexp
的身份匹配。
(gh-16102)
变更
删除对 __array__
的额外参数处理
从 NumPy 0.4 开始,代码路径和测试中已经存在一个 __array__(dtype=None, context=None)
的两参数变体。当调用 ufunc(op)
或 ufunc.reduce(op)
时,如果 op.__array__
存在,它会被激活。但是该变体未记录,并且不清楚其用途是什么。已将其移除。
(gh-15118)
numpy.random._bit_generator
移动到 numpy.random.bit_generator
为了将 numpy.random.BitGenerator
和 numpy.random.SeedSequence
暴露给 Cython,_bitgenerator
模块现在公开为 numpy.random.bit_generator
通过一个 pxd
文件提供 Cython 对随机分布的访问权限
c_distributions.pxd
提供了从 Cython 后面的多个随机分布的 c 函数的访问权限,方便使用和扩展它们。
(gh-15463)
修复了 numpy.random.multivariate_normal
中的 eigh
和 cholesky
方法
以前,当传递 method='eigh'
或 method='cholesky'
时,numpy.random.multivariate_normal
产生了错误分布的样本。现在已经修复。
(gh-15872)
修复了 MT19937.jumped
中的跳转实现
此修复改变了从跳转的 MT19937 生成器中生成的流。这不影响直接种子化的 RandomState
或 MT19937
产生的流。
MT19937 跳转代码的翻译包含了一个逆向的循环顺序。MT19937.jumped
匹配了松本真的 Horner 和滑动窗口跳转方法的原始实现。
(gh-16153)
高亮内容
-
代码不再兼容 Python 版本< 3.6(包括 Python 2)的版本。
numpy.compat
中的兼容性代码将继续支持第三方包,但它们可能在将来的版本中被弃用。请注意,由于使用了 f-strings,1.19.x 将不与早期版本的 Python 编译。(gh-15233)
弃用已过期
无法再向numpy.insert
和numpy.delete
传递 0d 数组的轴
这结束了从 1.9 开始的弃用,当向~numpy.insert
和~numpy.delete
的调用中传递了axis
参数时,0d 数组的axis
和obj
参数和索引将被完全忽略。在这些情况下,insert(arr, "nonsense", 42, axis=0)
实际上会覆盖整个数组,而delete(arr, "nonsense", axis=0)
将是arr.copy()
现在在 0d 数组上传递axis
会引发~numpy.AxisError
。
(gh-15802)
numpy.delete
不再忽略超出范围的索引
这结束了从 1.8 和 1.9 开始的弃用,其中np.delete
在序列索引中会忽略负数和超出范围的项目。与传递单个索引时的行为相矛盾。
现在超出范围的项目会抛出IndexError
,并且负数项目从末尾索引。
(gh-15804)
numpy.insert
和numpy.delete
不再接受非整数索引
这结束了从 1.9 开始的弃用,允许并将非整数索引序列转换为整数。现在传递非整数索引序列会引发IndexError
,就像传递单个非整数标量时一样。
(gh-15805)
numpy.delete
不再将布尔索引转换为整数
这结束了从 1.8 开始的弃用,其中np.delete
会将布尔数组和标量转换为整数索引。现在的行为是将布尔数组作为掩码处理,并对布尔标量引发错误。
(gh-15815)
无法再向numpy.insert
和numpy.delete
传递 0d 数组的轴
这结束了从 1.9 开始的弃用,当向~numpy.insert
和~numpy.delete
的调用中传递了axis
参数时,0d 数组的axis
和obj
参数和索引将被完全忽略。在这些情况下,insert(arr, "nonsense", 42, axis=0)
实际上会覆盖整个数组,而delete(arr, "nonsense", axis=0)
将是arr.copy()
现在在 0d 数组上传递axis
会引发~numpy.AxisError
。
(gh-15802)
numpy.delete
不再忽略超出范围的索引
这解决了从 1.8 版本和 1.9 版本开始的弃用情况,其中np.delete
会忽略序列索引中的负数和超出边界的项目。这与其仅传递单个索引时的行为相矛盾。
现在超出边界的项目会抛出IndexError
,而负数项目索引则从末尾开始。
(gh-15804)
numpy.insert
和numpy.delete
不再接受非整数索引
这解决了从 1.9 版本开始的一种弃用情况,其中允许传递非整数索引的序列并将其转换为整数。现在传递非整数索引的序列会引发IndexError
,就像传递单个非整数标量时一样。
(gh-15805)
numpy.delete
不再将布尔索引转换为整数
这解决了从 1.8 版本开始,np.delete
会将布尔数组和标量转换为索引参数。现在的行为是将布尔数组视为掩码,并对布尔标量抛出错误。
(gh-15815)
兼容性注意事项
将随机变量流从numpy.random.Generator.dirichlet
更改
通过使用不同的算法修复了在小的“alpha”值的 Dirichlet 分布的随机变量生成中的错误,即max(alpha) < 0.1
时。由于更改,这种情况下由dirichlet
生成的随机变量流将与先前版本不同。
(gh-14924)
PyArray_ConvertToCommonType
中的标量提升
PyArray_ConvertToCommonType
中混合标量和数组的提升已更改为符合np.result_type
的提升。这意味着类似(1000, np.array([1], dtype=np.uint8)))
的输入现在会返回uint16
数据类型。在大多数情况下,行为保持不变。请注意,通常不建议使用此 C-API 函数。这也修复了np.choose
在这方面的行为与 NumPy 的其余部分相同。
(gh-14933)
快速获取和快速放置掩码插槽已弃用并置空
快速获取和快速放置掩码插槽现在永远不会被使用,并且必须始终设置为 NULL。这不会导致行为改变。但是,如果用户数据类型应该设置其中一个,将会发出弃用警告。
(gh-14942)
np.ediff1d
与to_end
和 to_begin
的转换行为
np.ediff1d
现在对其附加的to_end
和to_begin
参数使用"same_kind"
转换规则。这可以确保类型安全,除非输入数组的整数类型小于to_begin
或to_end
。在少数情况下,行为将比 1.16 和 1.17 版本中更严格。这是为了解决浮点 NaN 的问题。
(gh-14981)
将空的类数组对象转换为 NumPy 数组
具有len(obj) == 0
的对象,其实现“类数组”接口,指实现obj.__array__()
,obj.__array_interface__
,obj.__array_struct__
或 Python 缓冲区接口的对象,并且也是序列(即 Pandas 对象),现在在转换为数组时将始终正确保留其形状。如果这样的对象以前具有形状(0, 1)
,它可能被转换为形状(0,)
的数组(在第一个 0 后失去所有维度)。
(gh-14995)
删除了multiarray.int_asbuffer
作为持续删除 Python 2 兼容性的一部分,移除了multiarray.int_asbuffer
。在 Python 3 上,它抛出NotImplementedError
并在内部未使用。预计在 Python 3 中不会有此方法的下游用例。
(gh-15229)
numpy.distutils.compat
已被移除
此模块仅包含函数get_exception()
,用法如下:
try:
...
except Exception:
e = get_exception()
它的目的是处理在 Python 2.6 中引入的语法更改,从except Exception, e:
到except Exception as e:
,这意味着它只对支持 Python 2.5 及更早版本的代码库是必要的。
(gh-15255)
issubdtype
不再解释float
为np.floating
numpy.issubdtype
自 NumPy 1.14 以来一直存在 FutureWarning,现在已经过期。这意味着某些输入,其中第二个参数既不是数据类型也不是 NumPy 标量类型(例如字符串或 Python 类型,如int
或float
),现在将与传入np.dtype(arg2).type
保持一致。这使结果符合预期,并在某些情况下导致先前返回 true 的错误结果。
(gh-15773)
更改对标量的round
输出,以使其与 Python 一致
__round__
dunder 方法的输出和因此 Python 内置的round
已更改为 Pythonint
,使其与在无参数调用时在 Pythonfloat
对象上调用它保持一致。先前,在 Pythonfloat
对象上调用时,它将返回传入的np.dtype
的标量。
(gh-15840)
numpy.ndarray
构造函数不再将strides=()
解释为strides=None
前者已更改为将numpy.ndarray.strides
设置为()
的预期含义,而后者则继续导致自动选择间距。
(gh-15882)
C 级字符串到日期时间的转换已更改
从字符串到日期时间和时间增量的 C 级转换已经简化。这一变化也修复了字符串到日期时间和时间增量转换的行为(即像使用string_arr.astype("M8")
的 Python 转换,而之前的转换行为像string_arr.astype(np.int_).astype("M8")
)。这仅影响使用低级 C-API 进行手动转换(而不是完整的数组转换)的代码,因此不会影响绝大多数用户。
(gh-16068)
具有小种子的SeedSequence
不再与生成冲突
小种子(小于2**96
)之前隐式地被填充为 128 位,内部熵池的大小。在生成时,生成密钥被连接在 0 填充之前。由于第一个生成密钥是(0,)
,生成前的小种子创建了与第一个生成的SeedSequence
相同的状态。现在,种子明确地被填充到内部池的大小,然后再连接生成密钥。生成的SeedSequence
将产生与之前版本不同的结果。未生成的SeedSequence
仍将产生相同的结果。
(gh-16551)
从numpy.random.Generator.dirichlet
更改随机变量流
修复了使用不同算法生成小“alpha”值的 Dirichlet 分布的随机变量时的 bug,当max(alpha) < 0.1
时。由于这个变化,在这种情况下,由dirichlet
生成的变量流将与先前的版本不同。
(gh-14924)
在PyArray_ConvertToCommonType
中的标量提升
使用np.result_type
的混合标量和数组在PyArray_ConvertToCommonType
的推广已被更改,以符合其使用的那些。这意味着输入,如(1000, np.array([1], dtype=np.uint8)))
现在将返回uint16
数据类型。在大多数情况下,行为不变。请注意,通常不鼓励使用这个 C-API 函数。这也修复了np.choose
在这方面与 NumPy 的其他部分行为相同。
(gh-14933)
fasttake
和fastputmask
槽已弃用并已设置为NULL
fasttake
和fastputmask
槽现在从不使用,必须始终设置为NULL
。这将不会改变行为。但是,如果用户数据类型应该设置其中一个,将会产生DeprecationWarning
。
(gh-14942)
np.ediff1d
与to_end
和to_begin
的类型转换行为
np.ediff1d
现在对其附加的to_end
和to_begin
参数使用了"same_kind"
转换规则。这确保了类型安全,除非输入数组的类型比to_begin
或to_end
小。在罕见的情况下,行为将比 1.16 和 1.17 中以前更严格。这是为了解决浮点 NaN 的问题。
(gh-14981)
将类似空数组对象转换为 NumPy 数组
具有len(obj) == 0
且实现“类似数组”的接口的对象,指的是实现了obj.__array__()
、obj.__array_interface__
、obj.__array_struct__
或 Python 缓冲区接口的对象,且也是序列(即 Pandas 对象),将在转换为数组时始终保持其正确的形状。如果此类对象先前的形状是(0, 1)
,它可能被转换为形状为(0,)
的数组(第一个 0 后面的所有维度被丢失)。
(gh-14995)
移除了multiarray.int_asbuffer
作为持续删除 Python 2 兼容性的一部分,multiarray.int_asbuffer
已被移除。在 Python 3 上,它会抛出一个NotImplementedError
,并且在内部未被使用。预期在 Python 3 中不会有此方法的下游用例。
(gh-15229)
numpy.distutils.compat
已被移除
此模块仅包含名为get_exception()
的函数,用法如下:
try:
...
except Exception:
e = get_exception()
它的目的是处理 Python 2.6 引入的语法变化,从except Exception, e:
到except Exception as e:
,意味着只有支持 Python 2.5 及更旧版本的代码库才是必需的。
(gh-15255)
issubdtype
不再将float
解释为np.floating
numpy.issubdtype
自 NumPy 1.14 以来一直有一个 FutureWarning,现在已过期。这意味着某些输入,其中第二个参数既不是数据类型也不是 NumPy 标量类型(如字符串或像int
或float
这样的 Python 类型),现在将与传入np.dtype(arg2).type
一致。这使结果与预期一致,并在某些先前返回 true 的情况下导致 false 结果。
(gh-15773)
将标量的round
输出更改为与 Python 一致
__round__
dunder 方法的输出和因此 Python 内置的round
已更改为一致,不带参数调用时将返回 Python int
。先前,如果传入np.dtype
,它会返回一个np.dtype
的标量。
(gh-15840)
numpy.ndarray
构造函数不再将strides=()
解释为strides=None
前者已更改为将numpy.ndarray.strides
设置为()
的预期含义,而后者继续自动选择步幅。
(gh-15882)
C 级字符串到日期时间的转换已更改
字符串的 C 级转换被简化。这一变化也修复了字符串到日期时间和时间间隔转换的行为(例如使用string_arr.astype("M8")
的 Python 转换,而以前的转换行为类似于string_arr.astype(np.int_).astype("M8")
)。这只影响使用低级 C-API 进行手动转换(而不是完整的数组转换)的代码的单个标量值,或者使用PyArray_GetCastFunc
,因此不应影响绝大部分用户。
(gh-16068)
SeedSequence
具有小种子将不再与生成发生冲突
小种子(小于2**96
)以前曾被隐式地 0 填充到 128 位,即内部熵池的大小。生成时,生成密钥在 0 填充之前被串联。由于第一个生成密钥是(0,)
,生成之前的小种子创建了与第一个生成SeedSequence
相同的状态。现在,种子在串联生成密钥之前被明确地 0 填充到内部池大小。生成的SeedSequences
将产生与上一个版本不同的结果。未生成的SeedSequences
将仍然产生相同的结果。
(gh-16551)
弃用
弃用对不规则输入的自动dtype=object
调用np.array([[1, [1, 2, 3]])
将根据NEP 34发出DeprecationWarning
。用户应该明确使用dtype=object
来避免警告。
(gh-15119)
向numpy.rec
的工厂函数传递shape=0
已被弃用
0
被视为特殊情况,并且在以下函数中别名为None
:
-
numpy.core.records.fromarrays
-
numpy.core.records.fromrecords
-
numpy.core.records.fromstring
-
numpy.core.records.fromfile
将来,0
将不再被特殊对待,将被视为与其他整数一样的数组长度。
(gh-15217)
弃用的可能未使用的 C-API 函数
下面的 C-API 函数可能未被使用,已被弃用:
-
PyArray_GetArrayParamsFromObject
-
PyUFunc_GenericFunction
-
PyUFunc_SetUsesArraysAsData
在大多数情况下,PyArray_GetArrayParamsFromObject
应该被转换为数组,而PyUFunc_GenericFunction
可以被PyObject_Call
替代(详见文档了解详情)。
(gh-15427)
转换某些类型到数据类型已经过时
标量类型的超类,如np.integer
,np.generic
,或np.inexact
在转换为数据类型(或在数据类型关键字参数中使用)时将会发出弃用警告。之所以这样做是因为np.integer
被转换为np.int_
,而它应该表示任何整数(例如,也包括int8
,int16
等)。例如,dtype=np.floating
目前与dtype=np.float64
相同,即使np.float32
也是np.floating
的子类。
(gh-15534)
废弃round
用于np.complexfloating
标量
复数标量的__round__
dunder 方法的输出以及因此 Python 内置的round
已经被废弃。这不影响np.round
。
(gh-15840)
numpy.ndarray.tostring()
已被废弃,推荐使用tobytes()
代替
~numpy.ndarray.tobytes
自 1.9 版以来就存在,但在此版中~numpy.ndarray.tostring
并没有发出警告。发出警告的变化使得 NumPy 与同名的内置array.array
方法保持一致。
(gh-15867)
废弃对不规则输入自动使用dtype=object
调用np.array([[1, [1, 2, 3]])
将会发出DeprecationWarning
,依照NEP 34。用户应该明确使用dtype=object
来避免这个警告。
(gh-15119)
传递shape=0
给numpy.rec
中的工厂函数已经被废弃
特殊情况下0
在以下函数中被别名为None
-
numpy.core.records.fromarrays
-
numpy.core.records.fromrecords
-
numpy.core.records.fromstring
-
numpy.core.records.fromfile
未来,0
将不再被特殊对待,将被当作其他整数一样对待。
(gh-15217)
废弃可能未被使用的 C-API 函数
以下的 C-API 函数可能没有被使用,已经被废弃:
-
PyArray_GetArrayParamsFromObject
-
PyUFunc_GenericFunction
-
PyUFunc_SetUsesArraysAsData
在大部分情况下PyArray_GetArrayParamsFromObject
应该被转换为数组,而PyUFunc_GenericFunction
可以被PyObject_Call
代替(详细信息请参阅文档)。
(gh-15427)
转换特定类型为 dtypes 已被废弃
标量类型的超类,比如np.integer
,np.generic
或者np.inexact
现在在转换为 dtype(或者在 dtype 关键字参数中使用)时将会产生废弃警告。这是因为np.integer
转换为了np.int_
,虽然它应该表示任何整数(比如int8
,int16
等)。例如,dtype=np.floating
目前与dtype=np.float64
完全相同,尽管np.float32
也是np.floating
的子类。
(gh-15534)
废弃round
用于np.complexfloating
标量
复数标量的__round__
dunder 方法的输出以及因此 Python 内置的round
已经被废弃。这不影响np.round
。
(gh-15840)
numpy.ndarray.tostring()
已被废弃,推荐使用tobytes()
代替
自 1.9 版本以来,~numpy.ndarray.tobytes
一直存在,但直到这个版本,~numpy.ndarray.tostring
没有发出任何警告。发出警告的改变使 NumPy 与相同名称的内置array.array
方法保持一致。
(gh-15867)
C API 变更
Better support for const
dimensions in API functions
以下函数现在接受一个常量数组npy_intp
:
-
PyArray_BroadcastToShape
-
PyArray_IntTupleFromIntp
-
PyArray_OverflowMultiplyList
以前,调用者必须将 const 修饰符去除才能调用这些函数。
(gh-15251)
Const qualify UFunc inner loops
UFuncGenericFunction
现在期望以指向 const dimension
和strides
的指针作为参数。这意味着内部循环可能不再修改dimension
或strides
。这一变化导致了incompatible-pointer-types
的警告,强迫用户要么忽略编译器的警告,要么在自己的循环签名中添加 const 修饰符。
(gh-15355)
Better support for const
dimensions in API functions
以下函数现在接受一个常量数组npy_intp
:
-
PyArray_BroadcastToShape
-
PyArray_IntTupleFromIntp
-
PyArray_OverflowMultiplyList
以前,调用者必须将 const 修饰符去除才能调用这些函数。
(gh-15251)
Const qualify UFunc inner loops
UFuncGenericFunction
现在期望以指向 const dimension
和strides
的指针作为参数。这意味着内部循环可能不再修改dimension
或strides
。这一变化导致了incompatible-pointer-types
的警告,强迫用户是否要忽略编译器的警告,或者在自己的循环签名中添加 const 修饰符。
(gh-15355)
新功能
numpy.frompyfunc
现在接受一个 identity 参数
这允许在生成的 ufunc 上设置numpy.ufunc.identity
属性,这意味着它可以用于空和多维调用numpy.ufunc.reduce
。
(gh-8255)
np.str_
标量现在支持缓冲区协议
np.str_
数组总是以 UCS4 格式存储,因此相应的标量现在通过缓冲区接口公开这一点,这意味着memoryview(np.str_('test'))
现在可以使用。
(gh-15385)
subok
选项用于numpy.copy
为numpy.copy
添加了一个新的关键字参数subok
,允许用户切换numpy.copy
相对于数组子类的行为。默认值为False
,与先前版本的 numpy 中numpy.copy
的行为一致。要创建一个保留数组子类的副本,调用np.copy(arr, subok=True)
。这个添加更好地说明了numpy.copy
的默认行为与numpy.ndarray.copy
方法有所不同,后者默认情况下尊重数组子类。
(gh-15685)
numpy.linalg.multi_dot
现在接受一个out
参数
out
可以用来避免通过numpy.linalg.multidot
计算的最终产品创建不必要的副本。
(gh-15715)
numpy.count_nonzero
的keepdims
参数
numpy.count_nonzero
添加了参数keepdims
。这个参数与numpy.sum
或numpy.mean
等缩减函数中的含义相同。
(gh-15870)
numpy.array_equal
的equal_nan
参数
numpy.array_equal
添加了关键字参数equal_nan
。equal_nan
是一个布尔值,用于切换在比较中是否将nan
值视为相等(默认值为False
)。这与numpy.isclose
和numpy.allclose
等相关函数中使用的 API 相匹配。
(gh-16128)
numpy.frompyfunc
现在接受一个 identity 参数
使得可以在生成的 ufunc 上设置numpy.ufunc.identity
特性,这意味着它可以用于空的和多维的numpy.ufunc.reduce
调用。
(gh-8255)
np.str_
标量现在支持缓冲协议
np.str_
数组始终以 UCS4 存储,因此相应的标量现在通过缓冲接口公开此特性,这意味着memoryview(np.str_('test'))
现在可以使用。
(gh-15385)
numpy.copy
的subok
选项
numpy.copy
添加了一个新的关键字参数subok
,允许用户切换numpy.copy
相对于数组子类的行为。默认值为False
,与先前版本的 numpy 中numpy.copy
的行为一致。要创建一个保留数组子类的副本,调用np.copy(arr, subok=True)
。这个添加更好地说明了numpy.copy
的默认行为与numpy.ndarray.copy
方法有所不同,后者默认情况下尊重数组子类。
(gh-15685)
numpy.linalg.multi_dot
现在接受一个out
参数
out
可以用来避免通过numpy.linalg.multidot
计算的最终产品创建不必要的副本。
(gh-15715)
对numpy.count_nonzero
添加了 keepdims
参数
添加了参数 keepdims
到 numpy.count_nonzero
。该参数的含义与在缩减函数中的含义相同,比如 numpy.sum
或 numpy.mean
。
(gh-15870)
numpy.array_equal
的 equal_nan
参数
numpy.array_equal
添加了关键字参数 equal_nan
。equal_nan
是一个布尔值,用于切换在比较中是否认为 nan
值相等(默认为 False
)。这与诸如 numpy.isclose
和 numpy.allclose
等相关函数中使用的 API 相匹配。
(gh-16128)
改进
改进 CPU 特性的检测
用更一般的函数 npy_cpu_init
和 npy_cpu_have
替换了npy_cpu_supports
,后者是一个用于测试 AVX 支持的 gcc 特定机制,并通过 NPY_CPU_HAVE
c-macro 以及 python-level __cpu_features__
字典来公开结果。
(gh-13421)
在 64 位平台上使用 64 位整数大小作为后备 lapack_lite
在后备 LAPACK 库中使用 64 位整数大小来处理线性代数的大数组,这在系统没有安装 LAPACK 时会发生。
(gh-15218)
当输入为 np.float64
时,使用 AVX512 内在来实现 np.exp
当输入为 np.float64
时,使用 AVX512 内在来实现 np.exp
,这可以将 np.float64
输入的 np.exp
的性能提高 5-7 倍。在 linux64 上,_multiarray_umath.so
模块已经增长了大约 63 KB。
(gh-15648)
禁用 madvise 大页的能力
在 Linux 上,NumPy 曾经添加了对 madvise 大页的支持,这可以改善非常大的数组的性能。不幸的是,在旧的内核版本上,这导致了性能回归,因此在 4.6 版本之前的内核上,默认情况下已禁用了对该支持。要覆盖默认设置,你可以使用环境变量:
NUMPY_MADVISE_HUGEPAGE=0
或将其设置为 1 以强制启用支持。请注意,这仅在操作系统设置为使用 madvise 透明大页时才有差异。
(gh-15769)
numpy.einsum
在下标列表中接受 NumPy int64
类型
当 numpy.einsum
以 NumPy int64
数组作为下标列表进行传递时,将不再抛出类型错误。
(gh-16080)
np.logaddexp2.identity
改变为 -inf
现在,ufunc ~numpy.logaddexp2
具有 -inf
的身份,允许其在空序列上调用。这与 ~numpy.logaddexp
的标识符匹配。
(gh-16102)
在 64 位平台上使用 64 位整数大小作为后备 lapack_lite
在 64 位平台上使用 64 位整数大小在回退 LAPACK 库中,当系统没有安装 LAPACK 时,允许其处理大数组的线性代数。
(gh-15218)
当输入为 np.float64
时,使用 AVX512 内在函数实现 np.exp
当输入为 np.float64
时,使用 AVX512 内在函数实现 np.exp
,可以比之前快 5-7 倍。在 linux64 下,_multiarray_umath.so
模块的大小增长了约 63KB。
(gh-15648)
禁用 madvise hugepages 的能力
在 Linux 上,NumPy 先前已添加了对 madvise hugepages 的支持,这可以改善非常大的数组的性能。不幸的是,在旧的内核版本上,这导致了性能回归,因此在内核版本低于 4.6 之前,默认情况下已禁用了对其的支持。要覆盖默认设置,您可以使用环境变量:
NUMPY_MADVISE_HUGEPAGE=0
或者将其设置为 1 以强制启用支持。请注意,只有在操作系统设置为使用 madvise 透明大页时,才会产生区别。
(gh-15769)
numpy.einsum
在下标列表中接受 NumPy int64
类型
当 numpy.einsum
以 NumPy int64
数组作为下标列表时,不再抛出类型错误。
(gh-16080)
np.logaddexp2.identity
更改为-inf
ufunc ~numpy.logaddexp2
现在具有-inf
的身份,允许在空序列上调用它。这与~numpy.logaddexp
的身份匹配。
(gh-16102)
变化
删除对__array__
的额外参数处理
从 NumPy 0.4 起,代码路径和测试就存在一个__array__(dtype=None, context=None)
的双参数变体。当调用 ufunc(op)
或 ufunc.reduce(op)
时,若存在 op.__array__
,则会激活它。然而,该变体没有文档说明,并且并不清楚其使用意图。已将其移除。
(gh-15118)
numpy.random._bit_generator
移至 numpy.random.bit_generator
为了将 numpy.random.BitGenerator
和 numpy.random.SeedSequence
暴露给 Cython,_bitgenerator
模块现在公开为 numpy.random.bit_generator
经由pxd
文件提供对随机分布的 Cython 访问
c_distributions.pxd
通过 Cython 提供了对许多随机分布背后的 C 函数的访问,使得使用和扩展它们变得更加方便。
(gh-15463)
修复了numpy.random.multivariate_normal
中的eigh
和cholesky
方法
以前,在传递 method='eigh'
或 method='cholesky'
时,numpy.random.multivariate_normal
产生了错误分布的样本。现在已经修复。
(gh-15872)
修复了MT19937.jumped
中的跳转实现
该修复改变了从跳动的 MT19937 生成器产生的流。它不影响直接种子化的RandomState
或MT19937
产生的流。
MT19937 的跳跃代码的翻译为反向循环顺序。MT19937.jumped
与松本真的 Horner 和滑动窗口跳跃方法的原始实现相匹配。
(gh-16153)
移除对__array__
的额外参数的处理
自 NumPy 0.4 以来,代码中一直存在着__array__(dtype=None, context=None)
的两个参数变体的代码路径和测试。当调用ufunc(op)
或ufunc.reduce(op)
时,如果op.__array__
存在,则会激活它。但是那个变体没有记录,并且不清楚其用途是什么。已将其移除。
(gh-15118)
numpy.random._bit_generator
移动到 numpy.random.bit_generator
为了将numpy.random.BitGenerator
和numpy.random.SeedSequence
暴露给 Cython,_bitgenerator
模块现在作为numpy.random.bit_generator
公开
Cython 通过pxd
文件提供对随机分布的访问
c_distributions.pxd
提供对 Cython 背后的许多随机分布的 C 函数的访问,使其方便使用和扩展。
(gh-15463)
修复了numpy.random.multivariate_normal
中的eigh
和cholesky
方法
以前,当传递method='eigh'
或method='cholesky'
时,numpy.random.multivariate_normal
生成了来自错误分布的样本。现在已修复。
(gh-15872)
修复了MT19937.jumped
中的跳跃实现
该修复改变了从跳动的 MT19937 生成器产生的流。它不影响直接种子化的RandomState
或MT19937
产生的流。
MT19937 的跳跃代码的翻译为反向循环顺序。MT19937.jumped
与松本真的 Horner 和滑动窗口跳跃方法的原始实现相匹配。
(gh-16153)
NumPy 1.18.5 版本发布说明
这是一个简短的版本,允许在 Python3.5 中使用 pickle protocol=5
。这是受到最近将 pickle5 回溯到 Python3.5 的启发。
此版本支持的 Python 版本为 3.5-3.8。下游开发人员应使用 Cython >= 0.29.15 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 来避免在 Skylake 架构上出现错误。
贡献者
共有 3 人为此版本做出了贡献。在其名字后面带有“+”符号的人第一次为补丁做出了贡献。
-
查尔斯·哈里斯
-
马蒂·皮卡斯
-
庄思远 +
已合并的拉取请求
共有 2 个拉取请求被合并到此版本中。
贡献者
共有 3 人为此版本做出了贡献。在其名字后面带有“+”符号的人第一次为补丁做出了贡献。
-
查尔斯·哈里斯
-
马蒂·皮卡斯
-
庄思远 +
已合并的拉取请求
共有 2 个拉取请求被合并到此版本中。