NumPy 1.20.0 版本说明#
这是迄今为止规模最大的 NumPy 版本发布,已合并来自 184 位贡献者的 684 个 PR。有关更多详细信息,请参阅下面的重点列表。此版本支持的 Python 版本为 3.7-3.9,已取消对 Python 3.6 的支持。重点如下:
NumPy 函数的注释。这项工作正在进行中,预计会根据用户的反馈进行改进。
更广泛地使用 SIMD 来提高 ufunc 的执行速度。在引入通用函数方面做了大量工作,这将简化在不同硬件平台上使用现代功能的难度。这项工作正在进行中。
更改 dtype 和转换实现的初步工作,以便为扩展 dtype 提供更简单的途径。这项工作正在进行中,但已经完成的工作足以进行实验和反馈。
大量的文档改进,包括大约 185 个 PR 合并。这项工作正在进行中,并且是改进 NumPy 在线资源和对新用户的实用性的更大项目的一部分。
与删除 Python 2.7 相关的进一步清理工作。这提高了代码的可读性并减少了技术债务。
对即将发布的 Cython 3.0 的初步支持。
新函数#
random.Generator 类有一个新的 permuted
函数。#
新函数与 shuffle
和 permutation
的区别在于,它对由轴索引的子数组进行置换,而不是将轴作为其他索引的每个组合的单独一维数组进行处理。例如,现在可以置换二维数组的行或列。
(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.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)
即使索引结果为空,也会报告索引错误#
将来,即使非索引维度长度为 0,当整数数组索引包含超出范围的值时,NumPy 也会引发 IndexError。这现在会发出 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
对于矩阵已被弃用#
使用outer
或泛型ufunc外部调用(例如numpy.add.outer
)时,np.matrix
的使用方法。以前,此处会将矩阵转换为数组。未来将不再执行此操作,需要手动转换为数组。
(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)
未来的更改#
数组不能使用子数组dtype#
使用np.array(arr, dtype)
和arr.astype(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)
兼容性说明#
isinstance(dtype, np.dtype)
而不是type(dtype) is not np.dtype
#
NumPy dtype不再是np.dtype
的直接实例。可能使用type(dtype) is np.dtype
的代码将始终返回False
,必须更新为使用正确的版本isinstance(dtype, np.dtype)
。
如果针对早于1.16.6的NumPy版本编译,此更改还会影响C端宏PyArray_DescrCheck
。如果代码使用此宏并希望针对旧版本的NumPy编译,则必须替换宏(另请参见C API更改部分)。
使用axis=None
的concatenate中的相同类型转换#
当使用axis=None
调用concatenate
时,扁平化数组使用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 float
)。与有符号整数不同,无符号整数不保留此特殊情况,因为它们的行为总是更像转换。以下代码不再引发错误:
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标量(不是像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#
浮点数和timedelta提升一致地引发TypeError。np.promote_types("float32", "m8")
现在与np.promote_types("m8", "float32")
一致,两者都引发TypeError。以前,np.promote_types("float32", "m8")
返回"m8"
,这被认为是一个错误。
Uint64和timedelta提升一致地引发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
参数(或传递dtype=None
并推断出结构化数据类型),则它会失败。例如
>>> 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_
,当使用dtype为非默认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: 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
实例的方法(例如 np.polymul
)的输出 dtype。
(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 的 API 不兼容。解决方法是针对 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
直接访问,也可通过 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
选项到 runtests,以便为您处理设置。这在将来对于任何类型代码生成也很有用,因为它将确保在类型检查之前构建项目。
(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
参数时,可以将 -j
、--cpu-baseline
、--cpu-dispatch
和 --disable-optimization
标志传递给 ASV build。
(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 库#
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.core.records.fromfile
现在可以使用类文件对象,例如 io.BytesIO
(gh-16675)
向 distutils 添加了 AIX 上的 RPATH 支持#
这允许在 AIX 上构建 SciPy。
(gh-16710)
使用命令行参数指定的 f90 编译器#
在 numpy.distutils.fcompiler
中更改了 Fortran Portland Group 编译器的编译器命令选择。这仅影响链接命令。这强制使用命令行选项(如果提供)提供的可执行文件,而不是 pgfortran 可执行文件。如果未向命令行选项提供可执行文件,则默认为 pfg90 可执行文件,根据 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
以避免有关已弃用 API 用法的 C 编译器警告。
(gh-16986)
使窗口函数完全对称#
确保 NumPy 提供的窗口函数是对称的。以前由于数值精度原因导致与对称性存在细微偏差,现在通过更好的计算安排避免了这些偏差。
(gh-17195)
性能改进和更改#
启用多平台 SIMD 编译器优化#
一系列针对 NumPy 基础架构的改进,为 **NEP-38** 铺平了道路,其总结如下:
新的构建参数
--cpu-baseline
用于指定所需的最小优化集,默认值为min
,它提供可以在广泛的用户平台上安全运行的最小 CPU 功能。--cpu-dispatch
用于指定额外优化的调度集,默认值为max -xop -fma4
,它启用所有 CPU 功能,但 AMD 遗留功能除外。--disable-optimization
用于明确禁用所有新的改进,它还添加了一个新的 **C** 编译器 #定义,称为NPY_DISABLE_OPTIMIZATION
,它可以用作任何 SIMD 代码的保护。
高级 CPU 调度程序
一个灵活的跨架构 CPU 调度程序,构建在 Python/Numpy distutils 之上,支持所有具有广泛 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)
更改#
np.linspace
整数输入现在使用向下取整#
在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)