NumPy 1.26.0 发布是 1.25.x 发布周期的延续,增加了对 Python 3.12.0 的支持。Python 3.12 放弃了 distutils,因此支持它需要找到一个替代方案来替代 NumPy 使用的 setup.py/distutils 基于的构建系统。我们选择使用 Meson 构建系统,这是第一个支持它的 NumPy 版本。这也是第一个支持 Cython 3.0 的版本,同时保留了 0.29.X 的兼容性。支持这两个升级是一个大项目,在这个版本中有 100 多个文件被修改。更新日志没有完全记录工作的全部范围,特别感谢 Ralf Gommers、Sayed Adel、Stéfan van der Walt 和 Matti Picus 在主要开发分支中做了大部分工作。
本版本的亮点包括:
本版本支持的 Python 版本为 3.9-3.12。
numpy.array_api
中的 Array API v2022.12 支持numpy.array_api
现在完全支持数组 API 标准的v2022.12 版本。请注意,这还不包括标准中的可选fft
扩展。(gh-23789)
在 macOS 13.3 中添加了对更新的 Accelerate BLAS/LAPACK 库的支持,包括 ILP64(64 位整数)支持。这带来了 arm64 支持,并且对常用线性代数运算的性能提升高达 10 倍。在构建时选择 Accelerate 时,如果可用,将自动使用 13.3+版本。
(gh-24053)
f2py
的meson
后端编译模式下的f2py
(即f2py -c
)现在接受--backend meson
选项。这是 Python 3.12
及以后版本的默认选项。旧版本仍将默认使用--backend distutils
。
为了在实际用例中支持这一点,在编译模式下,f2py
接受一个--dep
标志,可以多次使用,这将映射到meson
后端中的dependency()
调用,并且在distutils
后端中不起作用。
对于仅作为代码生成器使用f2py
的用户,即没有-c
选项的用户,没有任何更改。
(gh-24532)
f2py
添加了bind(c)
支持函数和子程序都可以用bind(c)
进行注释。f2py
将处理正确的类型映射,并保留其他C
接口的唯一标签。
注意: bind(c, name = 'routine_name_other_than_fortran_routine')
不会被 f2py
绑定所遵守,因为 bind(c)
与 name
旨在保证 C
和 Fortran
中的相同名称,而不是在 Python
和 Fortran
中。
(gh-24555)
f2py
对 iso_c_binding
的支持以前,用户必须定义自己的自定义 f2cmap
文件才能使用 Fortran2003 的 iso_c_binding
内在模块定义的类型映射。现在,这些类型映射已经被 f2py
原生支持。
(gh-24555)
在此版本中,NumPy 已经切换到 Meson 作为构建系统,meson-python 作为构建后端。安装 NumPy 或构建轮子可以使用标准工具如 pip
和 pypa/build
。支持以下内容:
pip install numpy
或(在克隆的仓库中)pip install .
python -m build
(首选),或 pip wheel .
pip install -e . --no-build-isolation
spin build
。
所有常规的 pip
和 pypa/build
标志(例如,--no-build-isolation
)应该按预期工作。
许多 NumPy 特定的构建自定义方式已经改变。不再支持控制 BLAS/LAPACK、SIMD、线程等选项的 NPY_*
环境变量,也不再支持用于选择 BLAS 和 LAPACK 的 site.cfg
文件。相反,可以通过 pip
/build
的配置设置接口传递命令行标志给构建。这些标志都列在仓库根目录的 meson_options.txt
文件中。在最终 1.26.0 版本发布之前将提供详细文档;目前请参阅 SciPy“从源代码构建”文档,因为大多数构建自定义方式在 SciPy 中的工作方式与 NumPy 中几乎相同。
虽然 NumPy 的运行时依赖关系没有改变,但构建依赖关系已经改变。由于我们暂时提供 Meson 和 meson-python,因此有几个新的依赖项 - 请查看 pyproject.toml
的 [build-system]
部分以获取详细信息。
这次构建系统的更改相当大。在出现意外问题的情况下,仍然可以使用基于 setup.py
的构建作为临时解决方案(在 Python 3.9-3.11 上,而不是 3.12),方法是将 pyproject.toml.setuppy
复制到 pyproject.toml
。但是,请在 NumPy 问题跟踪器上提出详细问题。我们的目标是尽快淘汰 setup.py
构建,因此希望在 1.26.0 发布周期的早期阶段发现所有潜在的阻碍因素。
���共有 20 人为此版本做出了贡献。名字后面带有“+”的人第一次为此贡献了补丁。
本次发布共合并了 59 个拉取请求。
_NestedSequence.__getitem__
签名
extbuild.py
。
asv dev
已被移除,请使用asv run
。
_umath_linalg
的依赖关系
binding
指令更改为“False”。
np.clip
添加缺失的casting
关键字
fromnumeric.pyi
iso_c_binding
类型映射和修复bind(c)
…
binary_repr
接受任何实现的对象…
dtype
和generic
可哈希
typing.assert_type
重构类型“reveal”测试
f2py
的meson
后端
numpy.array_api
中的 Array API v2022.12 支持numpy.array_api
现在完全支持 v2022.12 版本 的数组 API 标准。请注意,这还不包括标准中的可选 fft
扩展。(gh-23789)
在 macOS 13.3 中添加了对更新的 Accelerate BLAS/LAPACK 库的支持,包括 ILP64(64 位整数)支持。这带来了 arm64 支持,并且对常用线性代数运算的性能提升高达 10 倍。在构建时选择 Accelerate 时,如果可用,将自动使用 13.3+ 版本。
(gh-24053)
f2py
的 meson
��端f2py
在编译模式下(即 f2py -c
)现在接受 --backend meson
选项。这是 Python 3.12
及以后版本的默认选项。旧版本仍将默认使用 --backend distutils
。
为了在实际用例中支持这一点,在编译模式下,f2py
接受一个 --dep
标志一次或多次,它在 meson
后端中映射到 dependency()
调用,并在 distutils
后端中不执行任何操作。
对于仅作为代码生成器使用 f2py
的用户,没有任何更改,即没有 -c
。
(gh-24532)
f2py
的 bind(c)
支持函数和子程序都可以用 bind(c)
进行注释。f2py
将处理正确的类型映射,并保留其他 C
接口的唯一标签。
注意: bind(c, name = 'routine_name_other_than_fortran_routine')
是有意设计不被 f2py
绑定所接受的,因为 bind(c)
与 name
旨在仅保证 C
和 Fortran
中的相同名称,而不是 Python
和 Fortran
中的相同名称。
(gh-24555)
numpy.array_api
中的 Array API v2022.12 支持numpy.array_api
现在完全支持 v2022.12 版本 的数组 API 标准。请注意,这还不包括标准中的可选 fft
扩展。(gh-23789)
在 macOS 13.3 中添加了对更新的 Accelerate BLAS/LAPACK 库的支持,包括 ILP64(64 位整数)支持。这带来了 arm64 支持,并且对常用线性代数运算的性能提升高达 10 倍。在构建时选择 Accelerate 时,如果可用,将自动使用 13.3+版本。
(gh-24053)
f2py
的meson
后端编译模式下的f2py
(即f2py -c
)现在接受--backend meson
选项。这是 Python 3.12
及以后版本的默认选项。旧版本仍将默认为--backend distutils
。
为了支持实际用例,在编译模式下,f2py
接受一个--dep
标志一次或多次,它映射到meson
后端中的dependency()
调用,并在distutils
后端中不执行任何操作。
对于仅作为代码生成器使用f2py
的用户,即没有-c
的用户,没有任何更改。
(gh-24532)
f2py
的bind(c)
支持函数和子程序都可以用bind(c)
进行注释。f2py
将处理正确的类型映射,并保留其他C
接口的唯一标签。
注意: bind(c, name = 'routine_name_other_than_fortran_routine')
是设计上不被f2py
绑定所接受的,因为bind(c)
与name
旨在仅保证C
和Fortran
中的相同名称,而不是Python
和Fortran
中的相同名称。
(gh-24555)
f2py
的iso_c_binding
支持以前,用户必须定义自己的自定义f2cmap
文件,以使用 Fortran2003 iso_c_binding
内在模块定义的类型映射。这些类型映射现在由f2py
原生支持。
(gh-24555)
f2py
的iso_c_binding
支持以前,用户必须定义自己的自定义f2cmap
文件,以使用 Fortran2003 iso_c_binding
内在模块定义的类型映射。这些类型映射现在由f2py
原生支持。
(gh-24555)
在此版本中,NumPy 已切换到 Meson 作为构建系统,meson-python 作为构建后端。安装 NumPy 或构建轮可以使用标准工具如pip
和pypa/build
。以下是支持的:
pip install numpy
或(在克隆的存储库中)pip install .
python -m build
(首选),或pip wheel .
pip install -e . --no-build-isolation
spin build
。
所有常规的pip
和pypa/build
标志(例如,--no-build-isolation
)应按预期工作。
许多定制 NumPy 构建的特定方式已经发生了变化。不再支持控制 BLAS/LAPACK、SIMD、线程和其他选项的NPY_*
环境变量,也不再支持用于选择 BLAS 和 LAPACK 的site.cfg
文件。相反,可以通过pip
/build
的配置设置界面传递给构建的命令行标志。这些标志都列在存储库根目录中的meson_options.txt
文件中。详细文档将在最终 1.26.0 版本发布之前提供;目前请参阅SciPy“从源代码构建”文档,因为大多数构建定制方式在 SciPy 中的工作方式与在 NumPy 中的工作方式几乎相同。
虽然 NumPy 的运行时依赖关系没有改变,但构建依赖关系已经改变。由于我们暂时提供 Meson 和 meson-python,因此��几个新的依赖项 - 请查看pyproject.toml
的[build-system]
部分以获取详细信息。
这种构建系统的变化相当大。在出现意外问题的情况下,仍然可以使用基于setup.py
的构建作为临时解决方法(在 Python 3.9-3.11 上,而不是 3.12),方法是将pyproject.toml.setuppy
复制到pyproject.toml
。但是,请在 NumPy 问题跟踪器上提供有关问题的详细信息。我们的目标是尽快淘汰setup.py
构建,因此希望在 1.26.0 版本发布周期的早期阶段就看到所有潜在的阻碍因素。
许多定制 NumPy 构建的特定方式已经发生了变化。不再支持控制 BLAS/LAPACK、SIMD、线程和其他选项的NPY_*
环境变量,也不再支持用于选择 BLAS 和 LAPACK 的site.cfg
文件。相反,可以通过pip
/build
的配置设置界面传递给构建的命令行标志。这些标志都列在存储库根目录中的meson_options.txt
文件中。详细文档将在最终 1.26.0 版本发布之前提供;目前请参阅SciPy“从源代码构建”文档,因为大多数构建定制方式在 SciPy 中的工作方式与在 NumPy 中的工作方式几乎相同。
虽然 NumPy 的运行时依赖关系没有改变,但构建依赖关系已经改变。由于我们暂时提供 Meson 和 meson-python,因此有几个新的依赖项 - 请查看pyproject.toml
的[build-system]
部分以获取详细信息。
这种构建系统的变化相当大。在出现意外问题的情况下,仍然可以使用基于setup.py
的构建作为临时解决方法(在 Python 3.9-3.11 上,而不是 3.12),方法是将pyproject.toml.setuppy
复制到pyproject.toml
。但是,请在 NumPy 问题跟踪器上提供有关问题的详细信息。我们的目标是尽快淘汰setup.py
构建,因此希望在 1.26.0 版本发布周期的早期阶段就看到所有潜在的阻碍因素。
本次发布共有 20 位贡献者。名字后面带有“+”的人第一次贡献了补丁。
本次发布共合并了 59 个拉取请求。
_NestedSequence.__getitem__
签名
extbuild.py
。
asv dev
已被移除,请使用 asv run
。
_umath_linalg
的依赖关系
binding
指令更改为“False”。
np.clip
添加缺失的casting
关键字
fromnumeric.pyi
iso_c_binding
类型映射和修复bind(c)
…
binary_repr
接受任何实现…
dtype
和generic
可哈希
typing.assert_type
重构类型“reveal”测试
f2py
的meson
后端
NumPy 1.25.2 是一个维护版本,修复了在 1.25.1 发布后发现的错误和回归。这是 1.25.x 系列中计划的最后一个版本,下一个版本将是 1.26.0,将使用 meson 构建系统并支持 Python 3.12。这个版本支持的 Python 版本是 3.9-3.11。
一共有 13 人为这个版本做出了贡献。名字后面带有“+”的人第一次贡献了补丁。
一共有 19 个拉取请求被合并到这个版本中。
-ftrapping-math
与 Clang
np.__all__
中排除 min、max 和 round
getenv
调用
一共有 13 人为这个版本做出了贡献。名字后面带有“+”的人第一次贡献了补丁。
本次发布共合并了 19 个拉取请求。
-ftrapping-math
与 Clang
np.__all__
中排除 min、max 和 round
getenv
调用
NumPy 1.25.1 是一个维护版本,修复了 1.25.0 发布后发现的错误和回归问题。此版本支持的 Python 版本为 3.9-3.11。
总共有 10 人为此版本做出了贡献。名字后带有“+”的人第一次贡献了补丁。
总共有 14 个拉取请求合并到此版本中。
return NULL
为goto fail
__array_ufunc__
在没有传递任何 kwargs 的情况下正常工作
总共有 10 人为此版本做出了贡献。名字后带有“+”的人第一次贡献了补丁。
总共有 14 个拉取请求合并到此版本中。
return NULL
为goto fail
__array_ufunc__
在不传递任何 kwargs 的情况下正常工作
NumPy 1.25.0 版本持续改进处理和提升数据类型(dtypes)的工作,增加执行速度,并澄清文档。还进行了为未来 NumPy 2.0.0 版本做准备的工作,导致大量新的和过时的弃用。亮点包括:
@=
)。
当 Python 3.12 发布时,我们将发布 NumPy 1.26 版本。这是必要的,因为 Python 3.12 放弃了 distutils,我们将转而使用 meson 进行未来构建。下一个主要发布版本将是 NumPy 2.0.0。我们计划 2.0 系列仍将支持针对早期 NumPy 版本构建的下游项目。
本版本支持的 Python 版本为 3.9-3.11。
np.core.MachAr
已弃用。这是私有 API。在 np.core
中定义的名称通常应视为私有。
(gh-22638)
np.finfo(None)
已弃用。
(gh-23011)
np.round_
已弃用。请改用 np.round。
(gh-23302)
np.product
已弃用。请改用 np.prod。
(gh-23314)
np.cumproduct
已弃用。请改用 np.cumprod。
(gh-23314)
np.sometrue
已弃用。请改用 np.any。
(gh-23314)
np.alltrue
已弃用。请改用 np.all。
(gh-23314)
仅 ndim-0 数组被视为标量。NumPy 曾将所有大小为 1 的数组(例如,np.array([3.14])
)视为标量。将来,这将限制为 ndim 0 的数组(例如,np.array(3.14)
)。以下表达式将报告弃用警告:
a = np.array([3.14])
float(a) # better: a[0] to get the numpy.float or a.item()
b = np.array([[3.14]])
c = numpy.random.rand(10)
c[0] = b # better: c[0] = b[0, 0]
(gh-10615)
np.find_common_type
已被弃用。numpy.find_common_type
现已被弃用,应该用numpy.result_type
或numpy.promote_types
替换。大多数用户将find_common_type
的第二个scalar_types
参数保留为[]
,在这种情况下,np.result_type
和np.promote_types
都更快且更可靠。当不使用scalar_types
时,主要区别在于替代故意将非本机字节顺序转换为本机字节顺序。此外,find_common_type
返回object
dtype 而不是失败的提升。当输入不全为数值时,这会导致差异。重要的是,对于例如时间间隔/日期时间这样的情况,NumPy 提升规则目前有时会令人惊讶。
当scalar_types
参数不是[]
时,情况会变得更加复杂。在大多数情况下,使用np.result_type
并传递 Python 值0
,0.0
或0j
的结果与在scalar_types中使用int
,float
或complex
相同。
当构建scalar_types
时,np.result_type
是正确的替代方案,可以传递标量值如np.float32(0.0)
。传递除 0 以外的值可能会导致值检查行为(np.find_common_type
从未使用过,NEP 50 将来可能会更改)。在这种情况下,主要的行为变化可能是当数组类型为有符号整数而标量类型为无符号整数时。
如果您不确定如何替换对scalar_types
的使用,或者可能存在非数值 dtype,请不要犹豫打开一个 NumPy 问题寻求帮助。
(gh-22539)
np.core.machar
和np.finfo.machar
已被移除。
(gh-22638)
+arr
现在会引发错误(正数未定义)。
(gh-22998)
stack
,vstack
,hstack
,dstack
和column_stack
)。
(gh-23019)
np.clip
现在默认使用相同类型转换。在 NumPy 1.17 中,回退到不安全的转换已被弃用。
(gh-23403)
np.clip
现在会传播作为min
或max
传递的np.nan
值。以前,标量 NaN 通常被忽略。这在 NumPy 1.17 中已被弃用。
(gh-23403)
np.dual
子模块已被移除。
(gh-23480)
astype
或asarray
等数组创建函数中,当转换为子数组 dtype 时出现的FutureWarning
现已最终确定。现在的行为总是与将子数组 dtype 包装成单个字段时相同(这是以前的解决方法)。 (自 NumPy 1.20 起的 FutureWarning)
(gh-23666)
==
和!=
警告已最终确定。 数组上的==
和!=
运算符现在总是:
np.array([1, 2]) == np.array([1, 2, 3])
)。
True
或全为False
的数组。 一个例子是np.array(["a"]) == np.array([1])
。
这模仿了 Python 在比较不兼容类型时返回False
和True
的行为,例如"a" == 1
和"a" != 1
。 很长一段时间以来,这些都会产生DeprecationWarning
或FutureWarning
。
(gh-22707)
这些不应与具有类似名称的 pytest 版本混淆,例如 pytest.mark.slow,pytest.mark.skipif,pytest.mark.parametrize。 已移除的函数:
(gh-23041)
numpy.testing.utils
的 shim。 自 2019 年以来,从numpy.testing.utils
的 shim 导入已被弃用,现在已删除该 shim。 所有导入应直接从numpy.testing
进行。
(gh-23060)
NUMPY_EXPERIMENTAL_ARRAY_FUNCTION
环境变量的支持。 此变量禁用了__array_function__
的调度。
(gh-23376)
y=
作为out=
的别名的支持。 fix
,isposinf
和isneginf
函数允许使用y=
作为out=
的(已弃用的)别名。 这不再受支持。
(gh-23376)
busday_count
方法现在正确处理begindates
晚于enddates
的情况。 以前,即使文档规定始日期始终不包括在内,enddates
也会被包括在内。
(gh-23229)
np.equal
或np.not_equal
比较日期时间和时间间隔时,numpy 以前允许使用casting="unsafe"
进行比较。这个操作现在会失败。通过使用dtype
关键字参数强制输出 dtype 可以使操作成功,但我们不建议这样做。
(gh-22707)
np.load
从文件句柄加载数据时,如果句柄位于文件末尾,可能会通过多次调用np.load
读取多个数组,numpy 以前会在allow_pickle=False
时引发ValueError
,在allow_pickle=True
时引发OSError
。现在无论哪种情况都会引发EOFError
。
(gh-23105)
mode=wrap
的np.pad
用原始数据的严格倍数填充基于早期版本的pad
的代码,使用mode="wrap"
,当填充大小大于初始数组时,将返回不同的结果。
使用mode=wrap
的np.pad
现在总是用原始数据的严格倍数填充空间,即使填充大小大于初始数组。
(gh-22575)
long_t
和ulong_t
long_t
和ulong_t
是longlong_t
和ulonglong_t
的别名,令人困惑(Python 2 的遗留物)。这个更改可能会导致错误:
'long_t' is not a type identifier
'ulong_t' is not a type identifier
我们推荐使用诸如cnp.int64_t
这样的位大小类型,或者使用在 32 位系统上为 32 位,在 64 位系统上为 64 位的cnp.intp_t
(这对索引最兼容)。如果需要 C long
,请使用普通的long
或npy_long
。cnp.int_t
也是long
(NumPy 的默认整数)。但是,在 64 位 Windows 上,long
是 32 位的,即使在 NumPy 中我们可能希望调整这一点。(如果您对此感到好奇,请随时联系 NumPy 开发人员。)
(gh-22637)
ufunc
的错误消息和类型的错误axes
参数当向ufunc(..., axes=[...])
传递错误的axes
值时,错误消息和类型已更改。现在的消息更能指示问题,如果值不匹配,则会引发AxisError
。对于无效的输入类型仍会引发TypeError
。
(gh-22675)
__array_ufunc__
的类数组现在可以在作为where
使用时覆盖 ufuncs如果numpy.ufunc
的where
关键字参数是numpy.ndarray
的子类,或者是定义了numpy.class.__array_ufunc__
的鸭子类型,它可以使用与输入和输出参数相同的机制覆盖 ufunc 的行为。请注意,为了使其正常工作,where.__array_ufunc__
实现将必须解包where
参数以将其传递给ufunc
的默认实现,或者对于numpy.ndarray
子类,在使用super().__array_ufunc__
之前。
(gh-23240)
NumPy 现在默认公开 C-API 的向后兼容子集。这使得使用oldest-supported-numpy
变得不必要。库可以通过在包含 NumPy 之前或通过向编译器传递等效的-D
选项来覆盖默认的最小版本,以便与使用:
#define NPY_TARGET_VERSION NPY_1_22_API_VERSION
NumPy 1.25 的默认值是NPY_1_19_API_VERSION
。因为 NumPy 1.19 C API 与 NumPy 1.16 相同,因此生成的程序将与 NumPy 1.16 兼容(从 C-API 的角度来看)。这个默认值将在未来的非 bug 修复版本中增加。您仍然可以针对较旧的 NumPy 版本进行编译,并在更新的版本上运行。
更多详细信息请参见对于下游包作者。
(gh-23528)
np.einsum
现在接受具有object
dtype 的数组代码路径将在对象 dtype 数组上调用 python 运算符,就像np.dot
和np.matmul
一样。
(gh-18053)
现在可以通过@=
运算符执行原地矩阵乘法。
>>> import numpy as np
>>> a = np.arange(6).reshape(3, 2)
>>> print(a)
[[0 1]
[2 3]
[4 5]]
>>> b = np.ones((2, 2), dtype=int)
>>> a @= b
>>> print(a)
[[1 1]
[5 5]
[9 9]]
(gh-21120)
NPY_ENABLE_CPU_FEATURES
环境变量用户现在可以选择在运行时通过指定NPY_ENABLE_CPU_FEATURES环境变量来启用内置 CPU 功能的子集。请注意,这些指定的功能必须在基线之外,因为基线始终被假定。如果尝试启用 CPU 不支持的功能,或者 NumPy 未构建的功能,将会引发错误。
(gh-22137)
np.exceptions
命名空间NumPy 现在有一个专用的命名空间,使大多数异常和警告可用。所有这些仍然在主命名空间中可用,尽管一些可能会在将来慢慢移动。这样做的主要原因是增加可发现性并添加未来的异常。
(gh-22644)
np.linalg
函数返回 NamedTuples返回元组的 np.linalg
函数现在返回命名元组。这些函数是 eig()
、eigh()
、qr()
、slogdet()
和 svd()
。在这些函数返回具有特定关键字参数的非元组的实例中,返回类型保持不变(例如 svd(compute_uv=False)
)。
(gh-22786)
np.char
中的字符串函数与 NEP 42 自定义数据类型兼容现在可以将表示 Unicode 字符串或字节字符串的自定义数据类型传递给 np.char
中的字符串函数。
(gh-22863)
现在可以创建具有大小的字符串数据类型实例,而无需使用数据类型的字符串名称。例如,type(np.dtype('U'))(8)
将创建一个等效于 np.dtype('U8')
的数据类型。在编写处理字符串数据类型类的通用代码时,此功能非常有用。
(gh-22963)
添加了对富士通编译器的支持。要使用富士通编译器构建,请运行:
python setup.py build -c fujitsu
添加了对 SSL2 的支持。SSL2 是一个提供 OpenBLAS 兼容 GEMM 函数的库。要启用 SSL2,需要编辑 site.cfg 并使用富士通编译器构建。请参阅 site.cfg.example。
(gh-22982)
NDArrayOperatorsMixin
指定没有 __slots__
NDArrayOperatorsMixin
类现在指定不包含 __slots__
,确保子类现在可以在 Python 中使用此功能。
(gh-23113)
np.power
��在为复数返回不同的结果 0^{非零}
。请注意,当指数的实部大于零时才定义该值。以前,除非虚部严格为零,否则返回 NaN。返回值为 0+0j
或 0-0j
。
(gh-18535)
DTypePromotionError
NumPy 现在有一个新的 DTypePromotionError
,当两个数据类型无法提升为公共数据类型时使用,例如:
np.result_type("M8[s]", np.complex128)
引发此新异常。
(gh-22707)
构建和系统信息现在包含来自 Meson 的信息。np.show_config 现在具有一个新的可选参数 mode
,可帮助自定义输出。
(gh-22769)
np.ma.diff
在使用参数 prepend/append 时未保留掩码的问题。使用参数 prepend 和/或 append 调用 np.ma.diff
现在返回一个保留输入掩码的 MaskedArray
。
以前,返回没有掩码的 MaskedArray
。
(gh-22776)
许多为在 Cython 中使用而定义的 NumPy C 函数缺乏正确的错误指示器,如 except -1
或 except *
。现在已经添加了这些。
(gh-22997)
numpy.random.Generator.spawn
现在允许通过 numpy.random.SeedSequence.spawn
机制直接生成新的独立子生成器。numpy.random.BitGenerator.spawn
对底层位生成器执行相同操作。
此外,numpy.random.BitGenerator.seed_seq
现在直接访问用于初始化位生成器的种子序列。例如,这允许:
seed = 0x2e09b90939db40c400f8f22dae617151
rng = np.random.default_rng(seed)
child_rng1, child_rng2 = rng.spawn(2)
# safely use rng, child_rng1, and child_rng2
以前,这是很难做到的,没有显式传递 SeedSequence
。请参阅 numpy.random.SeedSequence
获取更多信息。
(gh-23195)
numpy.logspace
现在支持非标量 base
参数numpy.logspace
的 base
参数现在可以是类似数组的,如果可以与 start
和 stop
参数进行广播。
(gh-23275)
np.ma.dot()
现在支持非 2d 数组以前 np.ma.dot()
仅在 a
和 b
都是 2d 时才起作用。现在它也适用于非 2d 数组,如 np.dot()
。
(gh-23322)
打印 NpzFile
时显示加载的 .npz 文件的键。
>>> npzfile = np.load('arr.npz')
>>> npzfile
NpzFile 'arr.npz' with keys arr_0, arr_1, arr_2, arr_3, arr_4...
(gh-23357)
np.dtypes
中公开了 DType 类新的 numpy.dtypes
模块现在公开了 DType 类,并将包含未来与 dtype 相关的功能。大多数用户不需要直接使用这些类。
(gh-23358)
目前,包含具有元数据的 dtype 的表的 *.npy
文件无法读取。现在,np.save 和 np.savez 在保存之前会删除元数据。
(gh-23371)
numpy.lib.recfunctions.structured_to_unstructured
在更多情况下返回视图structured_to_unstructured
现在返回一个视图,如果字段之间的步幅是恒定的。之前,字段之间的填充或反转字段会导致复制。此更改仅适用于 ndarray
、memmap
和 recarray
。对于所有其他数组子类,行为保持不变。
(gh-23652)
当在 NumPy 中混合使用 uint64
和 int64
时,NumPy 通常会将两者都提升为 float64
。这种行为可能会引起争议,但对于比较 ==
、<=
来说是令人困惑的,因为返回的结果可能是不正确的,但转换是隐藏的,因为结果是布尔值。现在 NumPy 将通过避免转换为浮点数来返回这些正确的结果。
(gh-23713)
np.argsort
32 位和 64 位快速排序算法对 np.argsort 可以在支持 AVX-512 指令集的处理器上提高多达 6 倍的速度。
感谢 英特尔公司 赞助此工作。
(gh-23707)
np.sort
16 位和 64 位数据类型的快速排序在支持 AVX-512 指令集的处理器上提高了多达 15 倍和 9 倍的速度。
感谢 英特尔公司 赞助此工作。
(gh-22315)
__array_function__
机制现在更快NumPy 中大多数函数的开销现在更小,特别是在使用关键字参数时。这一变化显著加快了许多简单函数调用的速度。
(gh-23020)
ufunc.at
可以更快通用的 ufunc.at
可以提高多达 9 倍的速度。此加速的条件:
如果在满足上述条件的情况下,对 1 维参数使用适当的索引循环的 ufuncs,ufunc.at
的速度可以提高多达 60 倍(额外提升 7 倍速度)。已经在 add
、subtract
、multiply
、floor_divide
、maximum
、minimum
、fmax
和 fmin
中添加了适当的索引循环。
内部逻辑类似于常规 ufuncs 使用的逻辑,也有快速路径。
感谢 D. E. Shaw 集团 赞助此工作。
(gh-23136)
NpzFile
成员测试NpzFile
上的成员测试如果成功将不再解压存档。
(gh-23661)
np.r_[]
和 np.c_[]
与特定标量值在罕见情况下,主要使用 np.r_
与标量可能导致不同的结果。主要潜在变化如下所示:
>>> np.r_[np.arange(5, dtype=np.uint8), -1].dtype
int16 # rather than the default integer (int64 or int32)
>>> np.r_[np.arange(5, dtype=np.int8), 255]
array([ 0, 1, 2, 3, 4, 255], dtype=int16)
第二个示例返回:
array([ 0, 1, 2, 3, 4, -1], dtype=int8)
第一个是由于带有无符号整数数组的有符号整数标量,而第二个是由于255
无法容纳在int8
中,NumPy 目前正在检查值以使其正常工作。(请注意,由于NEP 50; 未来预计第二个示例将发生变化,然后将引发错误。)
(gh-22539)
为加快__array_function__
分派速度,大多数 NumPy 函数现在被包装为 C 可调用函数,而不是真正的 Python 函数或 C 方法。它们看起来和以前一样(像一个 Python 函数),这只会提高性能和用户体验(更清晰的回溯)。但是,如果此更改因某种原因使您的程序混淆,请通知 NumPy 开发人员。
(gh-23020)
NumPy 构建现在依赖于 C++标准库,因为numpy.core._multiarray_umath
扩展与 C++链接器链接。
(gh-23601)
np.core.MachAr
已被弃用。这是私有 API。在np.core
中定义的名称通常应被视为私有。
(gh-22638)
np.finfo(None)
已被弃用。
(gh-23011)
np.round_
已被弃用。请改用np.round。
(gh-23302)
np.product
已被弃用。请改用np.prod。
(gh-23314)
np.cumproduct
已被弃用。请改用np.cumprod。
(gh-23314)
np.sometrue
已被弃用。请改用np.any。
(gh-23314)
np.alltrue
已被弃用。请改用np.all。
(gh-23314)
仅将 ndim-0 数组视为标量。NumPy 过去将所有大小为 1 的数组(例如,np.array([3.14])
)视为标量。将来,这将限制为 ndim 0 的数组(例如,np.array(3.14)
)。以下表达式将报告弃用警告:
a = np.array([3.14])
float(a) # better: a[0] to get the numpy.float or a.item()
b = np.array([[3.14]])
c = numpy.random.rand(10)
c[0] = b # better: c[0] = b[0, 0]
(gh-10615)
np.find_common_type
已被弃用。numpy.find_common_type
现在已被弃用,应该用 numpy.result_type
或 numpy.promote_types
替代。大多数用户将 find_common_type
的第二个 scalar_types
参数设为 []
,在这种情况下,np.result_type
和 np.promote_types
都更快且更可靠。当不使用 scalar_types
时,主要区别在于替代意图将非本机字节顺序转换为本机字节顺序。此外,find_common_type
返回 object
dtype 而不是失败的提升。当输入不全为数字时,这会导致差异。重要的是,对于例如 timedelta/datetime 这样的情况,NumPy 提升规则目前有时会令人惊讶。
当 scalar_types
参数不是 []
时,情况会更加复杂。在大多数情况下,使用 np.result_type
并传递 Python 值 0
、0.0
或 0j
的结果与在 scalar_types 中使用 int
、float
或 complex
是相同的。
当构建 scalar_types
时,np.result_type
是正确的替代方案,可以传递标量值如 np.float32(0.0)
。传递非 0 的值可能导致值检查行为(np.find_common_type
从未使用过,NEP 50 可能会在未来更改)。在这种情况下,主要可能的行为变化是当数组类型为有符号整数而标量类型为无符号整数时。
如果您不确定如何替换 scalar_types
的使用,或者非数值 dtype 可能存在,请不要犹豫打开一个 NumPy 问题寻求帮助。
(gh-22539)
np.core.machar
和 np.finfo.machar
已被移除。
(gh-22638)
+arr
现在会引发错误(正数未定义)。
(gh-22998)
stack
、vstack
、hstack
、dstack
和 column_stack
)。
(gh-23019)
np.clip
现在默认使用相同类型转换。在 NumPy 1.17 中,回退到不安全的转换已被弃用。
(gh-23403)
np.clip
现在会传播作为 min
或 max
传递的 np.nan
值。以前,标量 NaN 通常被忽略。在 NumPy 1.17 中已被弃用。
(gh-23403)
np.dual
子模块已被移除。
(gh-23480)
astype
或数组创建函数(如 asarray
)中转换为子数组 dtype 时的 FutureWarning
现已最终确定。现在的行为总是与将子数组 dtype 包装成单个字段时相同(这是以前的解决方法)。(自 NumPy 1.20 起为 FutureWarning)
(gh-23666)
==
和 !=
警告已最终确定。现在数组上的 ==
和 !=
运算符总是:
np.array([1, 2]) == np.array([1, 2, 3])
)。
True
或全部为 False
的数组。一个例子是 np.array(["a"]) == np.array([1])
。
这模仿了 Python 的行为,当比较不兼容类型时返回 False
和 True
,例如 "a" == 1
和 "a" != 1
。很长一段时间,这些会产生 DeprecationWarning
或 FutureWarning
。
(gh-22707)
这些不应与具有类似名称的 pytest 版本混淆,例如 pytest.mark.slow、pytest.mark.skipif、pytest.mark.parametrize。 已移除的函数:
(gh-23041)
numpy.testing.utils
的 shim。自 2019 年以来,从 numpy.testing.utils
的 shim 导入已被弃用,现已移除。所有导入应直接从 numpy.testing
进行。
(gh-23060)
NUMPY_EXPERIMENTAL_ARRAY_FUNCTION
环境变量的支持。此变量禁用了 __array_function__
的分派。
(gh-23376)
y=
作为 out=
的别名的支持。fix
、isposinf
和 isneginf
函数允许使用 y=
作为(已弃用的)out=
的别名。这不再受支持。
(gh-23376)
busday_count
方法现在正确处理 begindates
晚于 enddates
的情况。以前,即使文档规定始终排除 enddates
,但 enddates
仍然被包括在内。
(gh-23229)
np.equal
或 np.not_equal
比较日期时间和时间增量时,numpy 以前允许使用 casting="unsafe"
进行比较。现在此操作会失败。通过使用 dtype
关键字参数强制输出数据类型可以使操作成功,但我们不建议这样做。
(gh-22707)
np.load
从文件句柄加载数据时,如果句柄位于文件末尾,可能会通过多次调用 np.load
读取多个数组,numpy 以前在 allow_pickle=False
时引发 ValueError
,在 allow_pickle=True
时引发 OSError
。现在无论哪种情况都会引发 EOFError
。
(gh-23105)
mode=wrap
的 np.pad
会以原始数据的严格倍数进行填充基于早期版本的 pad
的代码使用 mode="wrap"
,当填充大小大于初始数组时,将返回不同的结果。
使用 mode=wrap
的 np.pad
现在始终以原始数据的严格倍数填充空间,即使填充大小大于初始数组。
(gh-22575)
long_t
和 ulong_t
long_t
和 ulong_t
是 longlong_t
和 ulonglong_t
的别名,这容易引起混淆(这是 Python 2 的遗留问题)。这个改变可能导致以下错误:
'long_t' is not a type identifier
'ulong_t' is not a type identifier
我们建议使用诸如 cnp.int64_t
这样的位大小类型,或者使用 cnp.intp_t
,在 32 位系统上为 32 位,在 64 位系统上为 64 位(这对索引最兼容)。如果需要 C 的 long
,请使用普通的 long
或 npy_long
。cnp.int_t
也是 long
(NumPy 的默认整数)。但是,在 64 位 Windows 上,long
是 32 位,即使在 NumPy 中我们可能希望调整这一点。(如果您对此感到好奇,请随时联系 NumPy 开发人员。)
(gh-22637)
ufunc
的错误 axes
参数,已更改错误消息和类型当向 ufunc(..., axes=[...])
传递错误的 axes
值时,错误消息和类型已更改。现在的消息更具指示性,如果值不匹配,则会引发 AxisError
。对于无效的输入类型仍会引发 TypeError
。
(gh-22675)
__array_ufunc__
的类数组现在可以在作为 where
使用时覆盖 ufuncs。如果numpy.ufunc
的where
关键字参数是numpy.ndarray
的子类或者是定义了numpy.class.__array_ufunc__
的鸭子类型,它可以通过与输入和输出参数相同的机制覆盖ufunc
的行为。请注意,为了使其正常工作,where.__array_ufunc__
的实现将必须解开where
参数以将其传递给ufunc
的默认实现,或者在使用super().__array_ufunc__
之前将其传递给numpy.ndarray
的子类。
(gh-23240)
NumPy 现在默认公开一个向后兼容的 C-API 子集。这使得使用oldest-supported-numpy
变得不必要。库可以覆盖默认的最小版本以与以下兼容:
#define NPY_TARGET_VERSION NPY_1_22_API_VERSION
在包含 NumPy 之前或通过将等效的-D
选项传递给编译器之前。NumPy 1.25 的默认值是NPY_1_19_API_VERSION
。因为 NumPy 1.19 C API 与 NumPy 1.16 相同,因此生成的程序将与 NumPy 1.16 兼容(从 C-API 的角度看)。这个默认值将在未来的非 bug 修复版本中增加。您仍然可以针对较旧的 NumPy 版本进行编译,并在更新的版本上运行。
更多细节请参见 For downstream package authors。
(gh-23528)
mode=wrap
的np.pad
使用原始数据的严格倍数填充。基于早期版本的pad
的代码,使用mode="wrap"
会在填充大小大于初始数组时返回不同的结果。
现在,np.pad
使用mode=wrap
时,即使填充大小大于初始数组,也始终使用原始数据的严格倍数填充空间。
(gh-22575)
long_t
和ulong_t
。long_t
和ulong_t
是longlong_t
和ulonglong_t
的别名,令人困惑(Python 2 的遗留物)。这个更改可能导致错误:
'long_t' is not a type identifier
'ulong_t' is not a type identifier
我们建议使用比特大小类型,如cnp.int64_t
或使用在 32 位系统上为 32 位,在 64 位系统上为 64 位的cnp.intp_t
(这对索引最兼容)。如果需要 C long
,请使用普通的long
或npy_long
。cnp.int_t
也是long
(NumPy 的默认整数)。但是,在 64 位 Windows 上,long
是 32 位,我们可能会在 NumPy 中进行调整(如果您对此感到好奇,请随时联系 NumPy 开发人员)。
(gh-22637)
ufunc
的错误消息和axes
参数的类型。当将错误的axes
值传递给ufunc(..., axes=[...])
时,错误消息和类型已更改。现在的消息更能指示问题,如果值不匹配,则会引发AxisError
。对于无效的输入类型仍会引发TypeError
。
(gh-22675)
where
使用的 Array-like 定义了__array_ufunc__
,现在可以覆盖 ufunc。如果numpy.ufunc
的where
关键字参数是numpy.ndarray
的子类或者是定义了numpy.class.__array_ufunc__
的鸭子类型,它可以通过与输入和输出参数相同的机制覆盖 ufunc 的行为。请注意,为了使其正常工作,where.__array_ufunc__
的实现将必须解开where
参数以将其传递给ufunc
的默认实现,或者在使用super().__array_ufunc__
之前解开numpy.ndarray
子类。
(gh-23240)
NumPy 现在默认公开 C-API 的向后兼容子集。这使得使用oldest-supported-numpy
变得不必要。库可以覆盖默认的最小版本以与使用兼容:
#define NPY_TARGET_VERSION NPY_1_22_API_VERSION
在包含 NumPy 之前或通过向编译器传递等效的-D
选项之前。NumPy 1.25 的默认值是NPY_1_19_API_VERSION
。因为 NumPy 1.19 C API 与 NumPy 1.16 相同,因此生成的程序将与 NumPy 1.16 兼容(从 C-API 的角度看)。这个默认值将在未来的非 bug 修复版本中增加。您仍然可以针对较旧的 NumPy 版本进行编译并在更新的版本上运行。
更多详细信息请参见对于下游包作者。
(gh-23528)
np.einsum
现在接受具有object
dtype 的数组代码路径将在对象 dtype 数组上调用 python 运算符,就像np.dot
和np.matmul
一样。
(gh-18053)
现在可以通过@=
运算符执行原地矩阵乘法。
>>> import numpy as np
>>> a = np.arange(6).reshape(3, 2)
>>> print(a)
[[0 1]
[2 3]
[4 5]]
>>> b = np.ones((2, 2), dtype=int)
>>> a @= b
>>> print(a)
[[1 1]
[5 5]
[9 9]]
(gh-21120)
NPY_ENABLE_CPU_FEATURES
环境变量用户现在可以通过指定NPY_ENABLE_CPU_FEATURES环境变量在运行时选择仅启用内置 CPU 功能的子集。请注意,这些指定的功能必须在基线之外,因为这些功能总是被假定。如果尝试启用 CPU 不支持的功能,或者 NumPy 未构建的功能,将引发错误。
(gh-22137)
np.exceptions
命名空间NumPy 现在有一个专用的命名空间,使大多数异常和警告可用。所有这些仍然在主命名空间中可用,尽管一些可能会在未来慢慢移动。这样做的主要原因是增加可发现性并添加未来的异常。
(gh-22644)
np.linalg
函数返回 NamedTuples返回元组的np.linalg
函数现在返回 namedtuples。这些函数包括eig()
、eigh()
、qr()
、slogdet()
和svd()
。在这些函数返回非元组的情况下,返回类型不变,例如带有某些关键字参数的svd(compute_uv=False)
。
(gh-22786)
np.char
中的字符串函数与 NEP 42 自定义 dtype 兼容可以将代表 unicode 字符串或字节字符串的自定义 dtype 传递给np.char
中的字符串函数。
(gh-22863)
现在可以创建一个具有大小的字符串 dtype 实例,而不使用 dtype 的字符串名称。例如,type(np.dtype('U'))(8)
将创建一个等同于np.dtype('U8')
的 dtype。在编写处理字符串 dtype 类的通用代码时,此功能最为有用。
(gh-22963)
添加了对富士通编译器的支持。要使用富士通编译器构建,请运行:
python setup.py build -c fujitsu
添加了对 SSL2 的支持。SSL2 是一个提供 OpenBLAS 兼容 GEMM 函数的库。要启用 SSL2,需要编辑 site.cfg 并使用富士通编译器构建。参见 site.cfg.example。
(gh-22982)
np.einsum
现在接受具有object
dtype 的数组代码路径将在对象 dtype 数组上调用 python 运算符,类似于np.dot
和np.matmul
。
(gh-18053)
现在可以通过@=
运算符执行原地矩阵乘法。
>>> import numpy as np
>>> a = np.arange(6).reshape(3, 2)
>>> print(a)
[[0 1]
[2 3]
[4 5]]
>>> b = np.ones((2, 2), dtype=int)
>>> a @= b
>>> print(a)
[[1 1]
[5 5]
[9 9]]
(gh-21120)
NPY_ENABLE_CPU_FEATURES
环境变量用户现在可以通过指定NPY_ENABLE_CPU_FEATURES环境变量在运行时仅启用内置 CPU 功能的子集。请注意,这些指定的功能必须在基线之外,因为基线始终被假定。如果尝试启用不受 CPU 支持的功能,或者 NumPy 未构建的功能,则会引发错误。
(gh-22137)
np.exceptions
命名空间NumPy 现在有一个专用的命名空间,使大多数异常和警告可用。所有这些仍然在主命名空间中可用,尽管一些可能会在将来慢慢移动。这样做的主要原因是增加可发现性并添加未来的异常。
(gh-22644)
np.linalg
函数返回命名元组np.linalg
函数现在返回命名元组。这些函数包括eig()
、eigh()
、qr()
、slogdet()
和svd()
。在这些函数返回非元组的实例中,返回类型在某些关键字参数下保持不变(比如svd(compute_uv=False)
)。
(gh-22786)
np.char
中的字符串函数与 NEP 42 自定义 dtype 兼容现在可以将表示 Unicode 字符串或字节字符串的自定义 dtype 传递给np.char
中的字符串函数。
(gh-22863)
现在可以创建具有大小的字符串 dtype 实例,而无需使用 dtype 的字符串名称。例如,type(np.dtype('U'))(8)
将创建一个等效于np.dtype('U8')
的 dtype。在处理字符串 dtype 类的通用代码时,此功能最有用。
(gh-22963)
添加了对富士通编译器的支持。要使用富士通编译器构建,请运行:
python setup.py build -c fujitsu
添加了对 SSL2 的支持。SSL2 是一个提供 OpenBLAS 兼容 GEMM 函数的库。要启用 SSL2,需要编辑 site.cfg 并使用富士通编译器构建。请参阅 site.cfg.example。
(gh-22982)
NDArrayOperatorsMixin
指定没有__slots__
NDArrayOperatorsMixin
类现在指定不包含__slots__
,确保子类现在可以在 Python 中使用此功能。
(gh-23113)
np.power
现在为复数返回不同的结果0^{non-zero}
。请注意,该值仅在指数的实部大于零时定义。以前,除非虚部严格为零,否则返回 NaN。返回值为0+0j
或0-0j
。
(gh-18535)
DTypePromotionError
NumPy 现在有一个新的DTypePromotionError
,当两个 dtype 无法提升为一个公共 dtype 时使用,例如:
np.result_type("M8[s]", np.complex128)
引发这个新异常。
(gh-22707)
构建和系统信息现在包含来自 Meson 的信息。np.show_config现在有一个新的可选参数mode
,以帮助自定义输出。
(gh-22769)
np.ma.diff
在带有 prepend/append 参数调用时未保留掩码。调用np.ma.diff
时带有 prepend 和/或 append 参数现在返回一个保留输入掩码的MaskedArray
。
以前,返回的MaskedArray
没有掩码。
(gh-22776)
许多为在 Cython 中使用而定义的 NumPy C 函数缺乏正确的错误指示符,如except -1
或except *
。现在已添加。
(gh-22997)
numpy.random.Generator.spawn
现在允许通过numpy.random.SeedSequence.spawn
机制直接生成新的独立子生成器。numpy.random.BitGenerator.spawn
对底层比特生成器执行相同操作。
另外,numpy.random.BitGenerator.seed_seq
现在直接提供用于初始化比特生成器的种子序列的访问。这允许例如:
seed = 0x2e09b90939db40c400f8f22dae617151
rng = np.random.default_rng(seed)
child_rng1, child_rng2 = rng.spawn(2)
# safely use rng, child_rng1, and child_rng2
以前,这是很难做到的,没有明确传递SeedSequence
。请参阅numpy.random.SeedSequence
获取更多信息。
(gh-23195)
numpy.logspace
现在支持非标量base
参数numpy.logspace
的base
参数现在可以是类似数组,如果可以与start
��stop
参数进行广播。
(gh-23275)
np.ma.dot()
现在支持非 2d 数组以前np.ma.dot()
只在a
和b
都是 2d 时有效。现在它也适用于非 2d 数组,就像np.dot()
一样。
(gh-23322)
打印NpzFile
时显示加载的.npz 文件的键。
>>> npzfile = np.load('arr.npz')
>>> npzfile
NpzFile 'arr.npz' with keys arr_0, arr_1, arr_2, arr_3, arr_4...
(gh-23357)
np.dtypes
中公开了 DType 类新的numpy.dtypes
模块现在公开了 DType 类,并将包含未来与 dtype 相关的功能。大多数用户不需要直接使用这些类。
(gh-23358)
.npy
或.npz
文件之前,删除 dtype 元数据目前,包含具有元数据的 dtype 表的*.npy
文件无法读取。现在,在保存之前,np.save和np.savez会删除元数据。
(gh-23371)
numpy.lib.recfunctions.structured_to_unstructured
在更多情况下返回视图structured_to_unstructured
现在返回一个视图,如果字段之间的步幅是恒定的。以前,字段之间的填充或反转字段会导致复制。此更改仅适用于ndarray
、memmap
和recarray
。对于所有其他数组子类,行为保持不变。
(gh-23652)
当在 NumPy 中混合使用uint64
和int64
时,NumPy 通常将两者都提升为float64
。这种行为可能会引起争议,但对于比较==
、<=
来说很令人困惑,因为返回的结果可能是不正确的,但转换被隐藏,因为结果是布尔值。现在,NumPy 将避免转换为浮点数,以便为这些情况返回正确的结果。
(gh-23713)
NDArrayOperatorsMixin
指定它没有__slots__
NDArrayOperatorsMixin
类现在指定它不包含__slots__
,确保子类现在可以在 Python 中使用此功能。
(gh-23113)
np.power
现在对于复数的0^{non-zero}
返回不同的结果。请注意,只有当指数的实部大于零时,该值才被定义。以前,除非虚部严格为零,否则返回 NaN。返回值为0+0j
或0-0j
。
(gh-18535)
DTypePromotionError
NumPy 现在有一个新的DTypePromotionError
,当两个 dtype 无法提升为一个公共 dtype 时使用,例如:
np.result_type("M8[s]", np.complex128)
引发这���新异常。
(gh-22707)
构建和系统信息现在包含来自 Meson 的信息。np.show_config现在有一个新的可选参数mode
,以帮助自定义输出。
(gh-22769)
np.ma.diff
在调用时不保留掩码的问题,当使用参数 prepend/append 时。使用参数 prepend 和/或 append 调用np.ma.diff
现在返回一个保留输入掩码的MaskedArray
。
以前,返回没有掩码的MaskedArray
。
(gh-22776)
许多为在 Cython 中使用而定义的 NumPy C 函数缺乏正确的错误指示符,如 except -1
或 except *
。现在已经添加了这些。
(gh-22997)
numpy.random.Generator.spawn
现在允许通过 numpy.random.SeedSequence.spawn
机制直接生成新的独立子生成器。numpy.random.BitGenerator.spawn
对底层位生成器执行相同操作。
此外,numpy.random.BitGenerator.seed_seq
现在直接提供用于初始化位生成器的种子序列的访问权限。例如,这允许:
seed = 0x2e09b90939db40c400f8f22dae617151
rng = np.random.default_rng(seed)
child_rng1, child_rng2 = rng.spawn(2)
# safely use rng, child_rng1, and child_rng2
以前,这是很难做到的,没有显式传递 SeedSequence
。请参阅 numpy.random.SeedSequence
了解更多信息。
(gh-23195)
numpy.logspace
现在支持非标量 base
参数numpy.logspace
的 base
参数现在可以是类似数组,如果它可以与 start
和 stop
参数进行广播。
(gh-23275)
np.ma.dot()
现在支持非 2d 数组以前,np.ma.dot()
只能在 a
和 b
都是 2d 的情况下工作。现在它也适用于非 2d 数组,就像 np.dot()
一样。
(gh-23322)
NpzFile
在打印时显示加载的 .npz 文件的键。
>>> npzfile = np.load('arr.npz')
>>> npzfile
NpzFile 'arr.npz' with keys arr_0, arr_1, arr_2, arr_3, arr_4...
(gh-23357)
np.dtypes
中公开了 DType 类。新的 numpy.dtypes
模块现在公开了 DType 类,并将包含未来与 dtype 相关的功能。大多数用户不需要直接使用这些类。
(gh-23358)
目前,包含具有元数据的 dtype 的表的 *.npy
文件无法读取。现在,np.save 和 np.savez 在保存之前删除元数据。
(gh-23371)
numpy.lib.recfunctions.structured_to_unstructured
在更多情况下返回视图structured_to_unstructured
现在如果字段之间的步幅是恒定的,则返回一个视图。以前,字段之间的填充或反转字段会导致复制。此更改仅适用于ndarray
、memmap
和recarray
。对于所有其他数组子类,行为保持不变。
(gh-23652)
当 NumPy 中混合使用uint64
和int64
时,NumPy 通常会将两者都提升为float64
。这种行为可能会引起争议,但对于比较==
、<=
来说很令人困惑,因为返回的结果可能是不正确的,但转换是隐藏的,因为结果是布尔值。现在 NumPy 将通过避免转换为浮点数来返回这些正确的结果。
(gh-23713)
np.argsort
32 位和 64 位快速排序算法对支持 AVX-512 指令集的处理器获得高���6 倍的加速。
感谢英特尔公司赞助此工作。
(gh-23707)
np.sort
16 位和 64 位数据类型的快速排序获得高达 15 倍和 9 倍的加速,对支持 AVX-512 指令集的处理器。
感谢英特尔公司赞助此工作。
(gh-22315)
__array_function__
机制现在更快现在 NumPy 中大多数函数的开销更小,特别是在使用关键字参数时。这个改变显著加快了许多简单函数调用的速度。
(gh-23020)
ufunc.at
可以更快通用ufunc.at
可以快达到 9 倍。加速的条件:
如果 ufunc 在具有上述条件的 1d 参数上具有适当的索引循环,ufunc.at
可以快达到 60 倍(额外 7 倍加速)。已将适当的索引循环添加到add
、subtract
、multiply
、floor_divide
、maximum
、minimum
、fmax
和fmin
中。
内部逻辑类似于常规 ufunc 使用的逻辑,也有快速路径。
感谢D. E. Shaw 集团赞助此工作。
(gh-23136)
NpzFile
上更快的成员测试在NpzFile
上的成员测试如果成功将不再解压存档。
(gh-23661)
np.argsort
32 位和 64 位快速排序算法对支持 AVX-512 指令集的处理器获得高达 6 倍的加速。
感谢英特尔公司赞助此工作。
(gh-23707)
np.sort
16 位和 64 位数据类型的快速排序在支持 AVX-512 指令集的处理器上提高了 15 倍和 9 倍的速度。
感谢英特尔公司赞助此工作。
(gh-22315)
__array_function__
机制现在更快现在 NumPy 中大多数函数的开销更小,特别是在使用关键字参数时。这一变化显著加快了许多简单函数调用的速度。
(gh-23020)
ufunc.at
可以更快通用ufunc.at
可以快 9 倍。此加速的条件:
如果在满足上述条件的 1d 参数上具有适当索引循环的 ufunc,ufunc.at
可以快 60 倍(额外提速 7 倍)。已将适当的索引循环添加到add
、subtract
、multiply
、floor_divide
、maximum
、minimum
、fmax
和fmin
。
内部逻辑类似于常规 ufunc 使用的逻辑,也有快速路径。
感谢D. E. Shaw 集团赞助此工作。
(gh-23136)
NpzFile
上更快的成员测试在NpzFile
上的成员测试如果成功将不再解压存档。
(gh-23661)
np.r_[]
和np.c_[]
与特定标量值在罕见情况下,主要使用np.r_
与标量可能导致不同的结果。主要潜在变化如下所示:
>>> np.r_[np.arange(5, dtype=np.uint8), -1].dtype
int16 # rather than the default integer (int64 or int32)
>>> np.r_[np.arange(5, dtype=np.int8), 255]
array([ 0, 1, 2, 3, 4, 255], dtype=int16)
第二个示例返回:
array([ 0, 1, 2, 3, 4, -1], dtype=int8)
第一个是由于带有无符号整数数组的有符号整数标量,而第二个是由于255
无法容纳在int8
中,NumPy 目前正在检查值以使其正常工作。(请注意,由于NEP 50; 未来预计第二个示例将发生变化,然后会引发错误。)
(gh-22539)
为加快__array_function__
分派,现在大多数 NumPy 函数都被封装为 C 可调用函数,而不是正确的 Python 函数或 C 方法。它们看起来和感觉仍然与以前一样(像 Python 函数),这只会提高性能和用户体验(更清晰的回溯)。但是,如果此更改因某种原因使您的程序混淆,请通知 NumPy 开发人员。
(gh-23020)
现在 NumPy 构建依赖于 C++标准库,因为numpy.core._multiarray_umath
扩展与 C++链接器链接。
(gh-23601)
np.r_[]
和np.c_[]
与特定标量值在罕见情况下,主要使用np.r_
与标量可能导致不同的结果。主要潜在变化如下所示:
>>> np.r_[np.arange(5, dtype=np.uint8), -1].dtype
int16 # rather than the default integer (int64 or int32)
>>> np.r_[np.arange(5, dtype=np.int8), 255]
array([ 0, 1, 2, 3, 4, 255], dtype=int16)
第二个示例返回:
array([ 0, 1, 2, 3, 4, -1], dtype=int8)
第一个是由于带有无符号整数数组的有符号整数标量,而第二个是由于 255
无法容纳在 int8
中,而 NumPy 目前正在检查值以使其工作。(请注意,由于 NEP 50, 第二个示例预计将来会发生变化;然后会引发错误。)
(gh-22539)
为了加快 __array_function__
的分发,大多数 NumPy 函数现在被包装成 C 可调用函数,而不是正确的 Python 函数或 C 方法。它们看起来和感觉仍然与以前一样(像一个 Python 函数),这只会提高性能和用户体验(更清晰的回溯)。然而,如果这种变化因某种原因使您的程序混淆,请通知 NumPy 开发人员。
(gh-23020)
现在 NumPy 构建依赖于 C++ 标准库,因为 numpy.core._multiarray_umath
扩展与 C++ 链接器链接。
(gh-23601)