NumPy 1.24.0 发布继续致力于改进 dtype 的处理和提升,增加执行速度,并澄清文档。由于提升和清理的变化,还有大量新的和已过时的弃用功能。这可以称为弃用版本。亮点包括
-
许多新的弃用功能,请查看。
-
许多已过时的弃用功能,
-
新的 F2PY 功能和修复。
-
新的“dtype”和“casting”关键字用于堆叠函数。
详细信息请参见下文,
本次发布支持 Python 版本 3.8-3.11。
numpy.fastCopyAndTranspose
函数已被弃用。直接使用相应的复制和转置方法:
arr.T.copy()
底层 C 函数PyArray_CopyAndTranspose
也已从 NumPy C-API 中弃用。
(gh-22313)
尝试将 Python 整数转换为 NumPy 值现在将始终检查结果是否可以由 NumPy 表示。这意味着以下示例将来会失败,并现在会给出DeprecationWarning
:
np.uint8(-1)
np.array([3000], dtype=np.int8)
许多这些以前是成功的。这样的代码主要对带有负值的无符号整数有用,例如np.uint8(-1)
给出np.iinfo(np.uint8).max
。
请注意,NumPy 整数之间的转换不受影响,因此np.array(-1).astype(np.uint8)
仍然有效,并使用 C 整数溢出逻辑。对于负值,也可以查看数组:np.array(-1, dtype=np.int8).view(np.uint8)
。在某些情况下,使用np.iinfo(np.uint8).max
或val % 2**8
也可能效果很好。
在罕见情况下,输入数据可能混合负值和非常大的无符号值(即-1
和2**63
)。在这种情况下,不幸地需要在 Python 值上使用%
,或者根据是否预期负值使用有符号或无符号转换。
(gh-22385)
numpy.msort
函数已被弃用。请改用np.sort(a, axis=0)
。
(gh-22456)
以 0 位大小结尾的标量类型别名:np.object0
、np.str0
、np.bytes0
、np.void0
、np.int0
、np.uint0
以及np.bool8
现已弃用,并最终将被移除。
(gh-22607)
-
np.histogram、np.histogram2d和np.histogramdd中的
normed
关键字参数已被移除。请改用density
。如果normed
是按位置传递的,则现在使用density
。(gh-21645)
-
创建不规则数组现在将始终引发
ValueError
,除非传递了dtype=object
。这包括非常深度嵌套的序列。(gh-22004)
-
不再支持 Visual Studio 2015 及更早版本。
-
不再支持 Windows Interix POSIX 互操作层。
(gh-22139)
-
不再支持 Cygwin < 3.3。
(gh-22159)
-
np.ma.MaskedArray
的 mini()方法已被移除。请使用np.ma.MaskedArray.min()
或np.ma.minimum.reduce()
。 -
np.ma.minimum
和np.ma.maximum
的单参数形式已被移除。请改用np.ma.minimum.reduce()
或np.ma.maximum.reduce()
。(gh-22228)
-
在 ufuncs 中将除了主要本机字节顺序之外的 dtype 实例传递给
dtype=
或signature=
现在会引发TypeError
。我们建议传递字符串"int8"
或标量类型np.int8
,因为字节顺序、日期时间/时间增量单位等从不被强制执行。(在 NumPy 1.21 中最初被弃用。)(gh-22540)
-
对比 ufuncs 的
dtype=
参数现在被正确应用。这意味着只有bool
和object
是有效值,且dtype=object
被强制执行。(gh-22541)
-
别名
np.object
、np.bool
、np.float
、np.complex
、np.str
和np.int
的弃用已过期(引入 NumPy 1.20)。其中一些现在除了引发错误外还会产生 FutureWarning,因为它们将来会映射到 NumPy 标量。(gh-22607)
numpy.ndarray.fill
在某些情况下可能会有轻微不同的行为,因为逻辑与项目赋值对齐:
arr = np.array([1]) # with any dtype/value
arr.fill(scalar)
# is now identical to:
arr[0] = scalar
以前的转换可能在使用无法表示为目标dtype
的值或目标具有object
dtype 时产生略有不同的答案。
(gh-20924)
将包含子数组的 dtype 转换为对象将确保子数组的副本。以前会返回一个不安全的视图:
arr = np.ones(3, dtype=[("f", "i", 3)])
subarray_fields = arr.astype(object)[0]
subarray = subarray_fields[0] # "f" field
np.may_share_memory(subarray, arr)
现在始终为 false。而以前对于特定转换是 true。
(gh-21925)
当np.array
或asarray
与dtype
关键字参数一起使用时,返回数组的 dtype 现在总是与调用者提供的 dtype 完全匹配。
在某些情况下,这种变化意味着返回的是视图而不是输入数组。以下是 64 位 Linux 上的一个示例,其中long
和longlong
具有相同的精度但不同的dtypes
:
>>> arr = np.array([1, 2, 3], dtype="long")
>>> new_dtype = np.dtype("longlong")
>>> new = np.asarray(arr, dtype=new_dtype)
>>> new.dtype is new_dtype
True
>>> new is arr
False
在更改之前,dtype
不匹配是因为new is arr
为True
。
(gh-21995)
当无法通过 DLPack 导出数组缓冲区时,现在始终引发 BufferError
,之前可能引发 TypeError
或 RuntimeError
。这允许在首先尝试 DLPack 时回退到缓冲区协议或 __array_interface__
。
(gh-22542)
Ubuntu 18.04 已在 GitHub actions 中弃用,Ubuntu 20.04 上不提供 GCC-6,因此不再测试使用该编译器的构建。我们仍然测试使用 GCC-7 和 GCC-8 进行构建。
(gh-22598)
numpy.polynomial
包中的多项式类具有新的 symbol
属性,用于表示多项式的未知数。这可以用于在打印时更改变量的值:
>>> P_y = np.polynomial.Polynomial([1, 0, -1], symbol="y")
>>> print(P_y)
1.0 + 0.0·y¹ - 1.0·y²
注意多项式类仅支持 1D 多项式,因此在涉及具有不同符号的多项式的操作时,如果结果是多变量的,则不允许:
>>> P = np.polynomial.Polynomial([1, -1]) # default symbol is "x"
>>> P_z = np.polynomial.Polynomial([1, 1], symbol="z")
>>> P * P_z
Traceback (most recent call last)
...
ValueError: Polynomial symbols differ
符��可以是任何有效的 Python 标识符。默认为 symbol=x
,与现有行为一致。
(gh-16154)
F2PY 现在支持包装 Fortran 函数:
-
字符(例如
character x
) -
字符串数组(例如
character, dimension(n) :: x
) -
字符串(例如
character(len=10) x
) -
以及字符字符串数组(例如
character(len=10), dimension(n, m) :: x
)
参数,包括将 Python unicode 字符串作为 Fortran 字符串参数传递。
(gh-19388)
添加了一个新函数 numpy.show_runtime
,用于显示机器的运行时信息,除了显示构建相关信息的 numpy.show_config
。
(gh-21468)
testing.assert_array_equal
现在可用 strict
选项。设置 strict=True
将禁用标量的广播行为,并确保输入数组具有相同的数据类型。
(gh-21595)
np.unique
在 1.21 版本中更改,将所有 NaN
值视为相等并返回单个 NaN
。设置 equal_nan=False
将恢复到 1.21 版本之前的行为,将 NaNs
视为唯一。默认为 True
。
(gh-21623)
numpy.stack
现在可用 casting
和 dtype
关键字参数。要使用它们,请写成 np.stack(..., dtype=None, casting='same_kind')
。
numpy.vstack
现在可用 casting
和 dtype
关键字参数。要使用它们,请写成 np.vstack(..., dtype=None, casting='same_kind')
。
numpy.hstack
现在可用casting
和dtype
关键字参数。要使用它们,请写成np.hstack(..., dtype=None, casting='same_kind')
。
(gh-21627)
在启动时,numpy.random
模块中公开的单例RandomState
实例使用MT19937
位生成器进行初始化。新函数set_bit_generator
允许用用户提供的位生成器替换默认位生成器。引入此函数是为了提供一种方法,使新代码中可以无缝集成高质量、现代位生成器,同时又可以使用由单例提供的随机变量生成函数的现有代码。配套函数get_bit_generator
返回单例RandomState
正在使用的当前位生成器。这是为了在需要时简化恢复原始随机性源。
生成可重现随机数的首选方法是在Generator
实例中使用现代位生成器。函数default_rng
简化了实例化:
>>> rg = np.random.default_rng(3728973198)
>>> rg.random()
然后可以与单例实例共享相同的位生成器,以便调用random
模块中的函数将使用相同的位生成器:
>>> orig_bit_gen = np.random.get_bit_generator()
>>> np.random.set_bit_generator(rg.bit_generator)
>>> np.random.normal()
交换是永久的(直到被撤销),因此对random
模块中的函数的任何调用都将使用新的位生成器。如果需要,原始位生成器可以恢复以使代码正确运行:
>>> np.random.set_bit_generator(orig_bit_gen)
(gh-21976)
现在 NumPy 允许通过将dtype
参数传递给np.void
直接构造结构化空标量。
(gh-22316)
-
生成的扩展模块不再使用已弃用的 NumPy-C API。
-
改进了
f2py
生成的异常消息。 -
大量错误和
flake8
警告修复。 -
在 C 表达式中,可以使用的各种 CPP 宏都以
f2py_
为前缀。例如,应该使用f2py_len(x)
而不是len(x)
。 -
引入了一个新的构造
character(f2py_len=...)
,以支持从包装函数返回假定长度的字符字符串(例如character(len=*)
)。
引入了一个钩子,用于在读取所有输入文件后支持重写f2py
内部数据结构。例如,这对于 SciPy 支持的 BC 是必需的,其中字符参数在C
表达式中被视为字符字符串参数。
(gh-19388)
增加了对 zSystem(z13、z14、z15)的 SIMD 扩展的支持,通过通用内在函数接口。这种支持可以提高使用通用内在函数实现的所有 SIMD 内核的性能,包括以下操作:rint、floor、trunc、ceil、sqrt、absolute、square、reciprocal、tanh、sin、cos、equal、not_equal、greater、greater_equal、less、less_equal、maximum、minimum、fmax、fmin、argmax、argmin、add、subtract、multiply、divide。
(gh-20913)
在大多数情况下,NumPy 以前在转换期间发生浮点警告或错误时不会给出警告。例如,转换如下:
np.array([2e300]).astype(np.float32) # overflow for float32
np.array([np.inf]).astype(np.int64)
现在通常会给出浮点警告。这些警告应该警告浮点溢出发生。在将浮点值转换为整数时出现错误时,用户应该期望无效值警告。
用户可以使用 np.errstate
修改这些警告的行为。
浮点数到整数的转换警告可能与平台相关。例如:
arr = np.full(100, fill_value=1000, dtype=np.float64)
arr.astype(np.int8)
可能会给出等效于的结果(中间转换意味着不会给出警告):
arr.astype(np.int64).astype(np.int8)
可能返回未定义的结果,并设置警告:
RuntimeWarning: invalid value encountered in cast
具体行为取决于 C99 标准及其在软件和硬件中的实现。
(gh-21437)
Fortran 标准要求使用 value
属性声明的变量必须按值传递而不是按引用传递。F2PY 现在正确支持这种用法模式。因此,Fortran 代码中的 integer, intent(in), value :: x
将生成正确的包装器。
(gh-21807)
位生成器的 pickle 格式已扩展,允许每个位生成器在 pickling 期间提供自己的构造函数。NumPy 的早期版本仅支持使用 NumPy 提供的核心一组位生成器创建的 Generator
实例的 unpickling。尝试 unpickle 使用第三方位生成器的 Generator
将失败,因为在 unpickling 期间使用的构造函数仅知道 NumPy 中包含的位生成器。
(gh-22014)
以前,np.arange(n, dtype=str)
函数对 n=1
和 n=2
有效,但对其他值的 n
会引发一个非特定的异常消息。现在,它会引发一个 TypeError,提示 arange
不支持字符串 dtype:
>>> np.arange(2, dtype=str)
Traceback (most recent call last)
...
TypeError: arange() not supported for inputs with DType <class 'numpy.dtype[str_]'>.
(gh-22055)
numpy.typing.ArrayLike
和 numpy.typing.DTypeLike
中使用的协议现在被正确标记为运行时可检查,使它们更容易用于运行时类型检查器。
(gh-22357)
np.in1d
(被np.isin
使用)现在可以在传递两个整数数组时切换到更快的算法(速度提高了超过 10 倍)。这通常会自动使用,但您可以使用kind="sort"
或kind="table"
来分别强制使用旧方法或新方法。
(gh-12065)
比较函数(numpy.equal
,numpy.not_equal
,numpy.less
,numpy.less_equal
,numpy.greater
和numpy.greater_equal
)现在更快,因为它们现在使用通用内在函数进行矢量化。对于具有 SIMD 扩展 AVX512BW 的 CPU,整数、浮点和布尔数据类型���性能提升分别为 2.57 倍、1.65 倍和 19.15 倍(N=50000)。
(gh-21483)
标量和数组的整数除法溢出以前会提供RuntimeWarning
,返回值未定义,导致在罕见情况下崩溃:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: divide by zero encountered in floor_divide
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
整数除法溢出现在返回输入 dtype 的最小值并引发以下RuntimeWarning
:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: overflow encountered in floor_divide
array([-2147483648, -2147483648, -2147483648, -2147483648, -2147483648,
-2147483648, -2147483648, -2147483648, -2147483648, -2147483648],
dtype=int32)
(gh-21506)
当与copy=False
一起使用时,numpy.ma.masked_invalid
现在会就地修改输入的掩码数组。这使其行为与masked_where
完全相同,并更好地匹配文档。
(gh-22046)
通过 Python 中的np.nditer
和 C 中的NpyIter
可用的 NumPy 迭代器现在支持分配所有数组。在这种情况下,迭代器形状默认为()
。必须提供操作数的 dtype,因为无法从其他输入中推断出“公共 dtype”。
(gh-22457)
numpy.fastCopyAndTranspose
函数已被弃用。直接使用相应的复制和转置方法:
arr.T.copy()
底层的 C 函数PyArray_CopyAndTranspose
也已从 NumPy C-API 中弃用。
(gh-22313)
尝试将 Python 整数转换为 NumPy 值现在将始终检查结果是否可以由 NumPy 表示。这意味着以下示例将来将失败,并现在会给出DeprecationWarning
:
np.uint8(-1)
np.array([3000], dtype=np.int8)
许多这样的操作以前是成功的。这些代码主要用于具有负值的无符号整数,例如np.uint8(-1)
给出np.iinfo(np.uint8).max
。
注意,NumPy 整数之间的转换不受影响,因此np.array(-1).astype(np.uint8)
仍然有效,并使用 C 整数溢出逻辑。对于负值,也可以通过查看数组来实现:np.array(-1, dtype=np.int8).view(np.uint8)
。在某些情况下,使用np.iinfo(np.uint8).max
或val % 2**8
也可能效果很好。
在罕见情况下,输入数据可能混合负值和非常大的无符号值(即 -1
和 2**63
)。在这种情况下,不幸的是必须对 Python 值使用 %
,或者根据是否预期负值使用有符号或无符号转换。
(gh-22385)
numpy.msort
函数已被弃用。改用 np.sort(a, axis=0)
。
(gh-22456)
以 0 位大小结尾的标量类型别名:np.object0
、np.str0
、np.bytes0
、np.void0
、np.int0
、np.uint0
以及 np.bool8
现已被弃用,并最终将被移除。
(gh-22607)
numpy.fastCopyAndTranspose
函数已被弃用。直接使用相应的复制和转置方法:
arr.T.copy()
底层 C 函数 PyArray_CopyAndTranspose
也已从 NumPy C-API 中弃用。
(gh-22313)
尝试将 Python 整数转换为 NumPy 值现在将始终检查结果是否可以由 NumPy 表示。这意味着以下示例将在未来失败,并现在会给出 DeprecationWarning
:
np.uint8(-1)
np.array([3000], dtype=np.int8)
其中许多在以前确实成功。这样的代码主要对带有负值的无符号整数有用,例如 np.uint8(-1)
给出 np.iinfo(np.uint8).max
。
请注意,NumPy 整数之间的转换不受影响,因此 np.array(-1).astype(np.uint8)
仍然有效,并使用 C 整数溢出逻辑。对于负值,也可以查看数组:np.array(-1, dtype=np.int8).view(np.uint8)
。在某些情况下,使用 np.iinfo(np.uint8).max
或 val % 2**8
也可能很好地工作。
在罕见情况下,输入数据可能混合负值和非常大的无符号值(即 -1
和 2**63
)。在这种情况下,不幸的是必须对 Python 值使用 %
,或者根据是否预期负值使用有符号或无符号转换。
(gh-22385)
numpy.msort
函数已被弃用。改用 np.sort(a, axis=0)
。
(gh-22456)
以 0 位大小结尾的标量类型别名:np.object0
、np.str0
、np.bytes0
、np.void0
、np.int0
、np.uint0
以及 np.bool8
现已被弃用,并最终将被移除。
(gh-22607)
-
从 np.histogram、np.histogram2d 和 np.histogramdd 中移除了
normed
关键字参数。改用density
。如果normed
是按位置传递的,则现在使用density
。(gh-21645)
-
不规则数组创建现在除非传递
dtype=object
,否则将始终引发ValueError
。这包括非常深度嵌套的序列。(gh-22004)
-
不再支持 Visual Studio 2015 及更早版本。
-
不再支持 Windows Interix POSIX 互操作层。
(gh-22139)
-
支持 Cygwin < 3.3 已被移除。
(gh-22159)
-
np.ma.MaskedArray
的mini()
方法已被移除。改用np.ma.MaskedArray.min()
或np.ma.minimum.reduce()
。 -
np.ma.minimum
和np.ma.maximum
的单参数形式已被移除。改用np.ma.minimum.reduce()
或np.ma.maximum.reduce()
。(gh-22228)
-
在 ufuncs 中将除了主要的(主要是本机字节顺序)规范 dtype 实例传递给
dtype=
或signature=
现在会引发TypeError
。我们建议传递字符串"int8"
或标量类型np.int8
,因为字节顺序、日期时间/时间增量单位等从不被强制执行。(在 NumPy 1.21 中最初被弃用。)(gh-22540)
-
对比较 ufuncs 的
dtype=
参数现在被正确应用。这意味着只有bool
和object
是有效值,且dtype=object
被强制执行。(gh-22541)
-
对于别名
np.object
、np.bool
、np.float
、np.complex
、np.str
和np.int
的弃用已过期(引入于 NumPy 1.20)。其中一些现在除了引发错误外还会产生 FutureWarning,因为它们将来会映射到 NumPy 标量。(gh-22607)
numpy.ndarray.fill
现在在某些情况下可能会有略微不同的行为,因为逻辑与项赋值对齐:
arr = np.array([1]) # with any dtype/value
arr.fill(scalar)
# is now identical to:
arr[0] = scalar
以前的强制转换可能在使用无法表示为目标 dtype
的值或目标具有 object
dtype 时产生略有不同的答案。
(gh-20924)
将包含子数组的 dtype 强制转换为对象将确保子数组的副本。之前返回的是不安全的视图:
arr = np.ones(3, dtype=[("f", "i", 3)])
subarray_fields = arr.astype(object)[0]
subarray = subarray_fields[0] # "f" field
np.may_share_memory(subarray, arr)
现在始终为 false。而之前对于特定转换是 true。
(gh-21925)
当 dtype
关键字参数与 np.array
或 asarray
一起使用时,返回数组的 dtype 现在始终与调用者提供的 dtype 完全匹配。
在某些情况下,这个变化意味着返回的是视图而不是输入数组。以下是在 64 位 Linux 上的一个示例,其中 long
和 longlong
具有相同的精度但不同的 dtypes
:
>>> arr = np.array([1, 2, 3], dtype="long")
>>> new_dtype = np.dtype("longlong")
>>> new = np.asarray(arr, dtype=new_dtype)
>>> new.dtype is new_dtype
True
>>> new is arr
False
在更改之前,dtype
不匹配是因为new is arr
为True
。
(gh-21995)
当数组缓冲区无法通过 DLPack 导出时,现在总是引发BufferError
,而以前会引发TypeError
或RuntimeError
。这允许在首次尝试 DLPack 时回退到缓冲区协议或__array_interface__
。
(gh-22542)
Ubuntu 18.04 已在 GitHub 操作中弃用,Ubuntu 20.04 上不可用 GCC-6,因此不再测试使用该编译器的构建。我们仍然测试使用 GCC-7 和 GCC-8 进行构建。
(gh-22598)
numpy.ndarray.fill
在某些情况下可能会因为逻辑与项目赋值对齐而略有不同:
arr = np.array([1]) # with any dtype/value
arr.fill(scalar)
# is now identical to:
arr[0] = scalar
以前进行转换时,当使用无法表示为目标dtype
的值或目标具有object
dtype 时,可能会产生略有不同的答案。
(gh-20924)
将包含子数组的 dtype 转换为对象现在将确保子数组的副本。以前会返回一个不安全的视图:
arr = np.ones(3, dtype=[("f", "i", 3)])
subarray_fields = arr.astype(object)[0]
subarray = subarray_fields[0] # "f" field
np.may_share_memory(subarray, arr)
现在总是为 false。而以前对于特定转换是 true。
(gh-21925)
当使用np.array
或asarray
时,如果使用了dtype
关键字参数,则返回数组的 dtype 现在总是与调用者提供的 dtype 完全匹配。
在某些情况下,这种更改意味着返回的是视图而不是输入数组。以下是 64 位 Linux 上的一个示例,其中long
和longlong
具有相同的精度但不同的dtypes
:
>>> arr = np.array([1, 2, 3], dtype="long")
>>> new_dtype = np.dtype("longlong")
>>> new = np.asarray(arr, dtype=new_dtype)
>>> new.dtype is new_dtype
True
>>> new is arr
False
在更改之前,dtype
不匹配是因为new is arr
为True
。
(gh-21995)
当数组缓冲区无法通过 DLPack 导出时,现在总是引发BufferError
,而以前会引发TypeError
或RuntimeError
。这允许在首次尝试 DLPack 时回退到缓冲区协议或__array_interface__
。
(gh-22542)
Ubuntu 18.04 已在 GitHub 操作中弃用,Ubuntu 20.04 上不可用 GCC-6,因此不再测试使用该编译器的构建。我们仍然测试使用 GCC-7 和 GCC-8 进行构建。
(gh-22598)
numpy.polynomial
包中的多项式类具有一个新的 symbol
属性,用于表示多项式的未知数。这可用于在打印时更改变量的值:
>>> P_y = np.polynomial.Polynomial([1, 0, -1], symbol="y")
>>> print(P_y)
1.0 + 0.0·y¹ - 1.0·y²
请注意,多项式类仅支持 1D 多项式,因此涉及具有不同符号的多项式的操作在结果为多变量时是不允许的:
>>> P = np.polynomial.Polynomial([1, -1]) # default symbol is "x"
>>> P_z = np.polynomial.Polynomial([1, 1], symbol="z")
>>> P * P_z
Traceback (most recent call last)
...
ValueError: Polynomial symbols differ
符号可以是任何有效的 Python 标识符。默认为 symbol=x
,与现有行为一致。
(gh-16154)
F2PY 现在支持包装 Fortran 函数:
-
字符(例如
character x
) -
字符数组(例如
character, dimension(n) :: x
) -
字符串(例如
character(len=10) x
) -
和字符字符串数组(例如
character(len=10), dimension(n, m) :: x
)
参数,包括将 Python Unicode 字符串作为 Fortran 字符串参数传递。
(gh-19388)
已添加一个新函数 numpy.show_runtime
,用于显示机器的运行时信息,除了 numpy.show_config
显示构建相关信息。
(gh-21468)
strict
选项现在可用于 testing.assert_array_equal
。设置 strict=True
将禁用标量的广播行为,并确保输入数组具有相同的数据类型。
(gh-21595)
np.unique
在 1.21 版本中已更改,将所有 NaN
值视为相等并返回单个 NaN
。设置 equal_nan=False
将恢复到 1.21 版本之前的行为,将 NaN
视为唯一。默认为 True
。
(gh-21623)
casting
和 dtype
关键字参数现在可用于 numpy.stack
。要使用它们,请写成 np.stack(..., dtype=None, casting='same_kind')
。
casting
和 dtype
关键字参数现在可用于 numpy.vstack
。要使用它们,请写成 np.vstack(..., dtype=None, casting='same_kind')
。
casting
和 dtype
关键字参数现在可用于 numpy.hstack
。要使用它们,请写成 np.hstack(..., dtype=None, casting='same_kind')
。
(gh-21627)
在numpy.random
模块中公开的单例RandomState
实例在启动时使用MT19937
位生成器进行初始化。新函数set_bit_generator
允许用用户提供的位生成器替换默认位生成器。引入此函数是为了提供一种方法,使新代码中可以无缝集成高质量、现代的位生成器,并与使用单例提供的随机变量生成函数的现有代码进行整合。伴随函数get_bit_generator
返回单例RandomState
正在使用的当前位生成器。这是为了在需要时简化恢复原始随机性源的过程。
生成可复现随机数的首选方法是在Generator
实例中使用现代位生成器。函数default_rng
简化了实例化过程:
>>> rg = np.random.default_rng(3728973198)
>>> rg.random()
然后可以将相同的位生成器与单例实例共享,以便调用random
模块中的函数将使用相同的位生成器:
>>> orig_bit_gen = np.random.get_bit_generator()
>>> np.random.set_bit_generator(rg.bit_generator)
>>> np.random.normal()
交换是永久的(直到被撤销),因此对random
模块中的函数的任何调用都将使用新的位生成器。如果需要,原始位生成器可以恢复以使代码正确运行:
>>> np.random.set_bit_generator(orig_bit_gen)
(gh-21976)
NumPy 现在允许通过将dtype
参数传递给np.void
直接构造结构化空标量。
(gh-22316)
numpy.polynomial
包中的多项式类具有一个新的symbol
属性,用于表示多项式的未知数。这可用于在打印时更改变量的值:
>>> P_y = np.polynomial.Polynomial([1, 0, -1], symbol="y")
>>> print(P_y)
1.0 + 0.0·y¹ - 1.0·y²
请注意,多项式类仅支持 1D 多项式,因此在涉及具有不同符号的多项式且结果为多变量时,不允许进行操作:
>>> P = np.polynomial.Polynomial([1, -1]) # default symbol is "x"
>>> P_z = np.polynomial.Polynomial([1, 1], symbol="z")
>>> P * P_z
Traceback (most recent call last)
...
ValueError: Polynomial symbols differ
符号可以是任何有效的 Python 标识符。默认为symbol=x
,与现有行为一致。
(gh-16154)
F2PY 现在支持包装 Fortran 函数:
-
字符(例如
character x
) -
字符数组(例如
character, dimension(n) :: x
) -
字符串(例如
character(len=10) x
) -
和字符字符串数组(例如
character(len=10), dimension(n, m) :: x
)
参数,包括将 Python Unicode 字符串作为 Fortran 字符串参数传递。
(gh-19388)
添加了一个新函数numpy.show_runtime
,用于显示机器的运行时信息,此外numpy.show_config
显示了与构建相关的信息。
(gh-21468)
testing.assert_array_equal
现在可用strict
选项。设置strict=True
将禁用标量的广播行为,并确保输入��组具有相同的数据类型。
(gh-21595)
np.unique
在 1.21 版本中已更改,将所有NaN
值视为相等并返回单个NaN
。设置equal_nan=False
将恢复到 1.21 版本之前的行为,将NaN
视为唯一。默认为True
。
(gh-21623)
numpy.stack
现在也可以使用casting
和dtype
关键字参数。要使用它们,写成np.stack(..., dtype=None, casting='same_kind')
。
numpy.vstack
的casting
和dtype
关键字参数现在也可用。要使用它们,写成np.vstack(..., dtype=None, casting='same_kind')
。
现在numpy.hstack
也可以使用casting
和dtype
关键字参数。要使用它们,写成np.hstack(..., dtype=None, casting='same_kind')
。
(gh-21627)
在启动时,numpy.random
模块中公开的单例RandomState
实例使用MT19937
比特生成器进行初始化。新函数set_bit_generator
允许将默认比特生成器替换为用户提供的比特生成器。此函数已被引入,以提供一种方法,允许在新代码中无缝集成高质量、现代比特生成器,并与使用单例提供的随机变量生成函数的现有代码进行整合。配套函数get_bit_generator
返回单例RandomState
正在使用的当前比特生成器。这是为了在需要时简化恢复原始随机性源。
生成可复现随机数的首选方法是在Generator
实例中使用现代比特生成器。函数default_rng
简化了实例化:
>>> rg = np.random.default_rng(3728973198)
>>> rg.random()
然后可以将相同的比特生成器与单例实例共享,以便调用random
模块中的函数将使用相同的比特生成器:
>>> orig_bit_gen = np.random.get_bit_generator()
>>> np.random.set_bit_generator(rg.bit_generator)
>>> np.random.normal()
交换是永久的(直到被逆转),因此对random
模块中的函数的任何调用都将使用新的比特生成器。如果需要代码正确运行,原始状态可以恢复:
>>> np.random.set_bit_generator(orig_bit_gen)
(gh-21976)
现在 NumPy 允许通过将dtype
参数传递给np.void
直接构造结构化空标量。
(gh-22316)
-
生成的扩展模块不再使用已弃用的 NumPy-C API
-
改进了由
f2py
生成的异常消息 -
大量错误和
flake8
警告修复 -
在签名文件的 C 表达式中可以使用的各种 CPP 宏都以
f2py_
为前缀。例如,应该使用f2py_len(x)
而不是len(x)
-
引入了一个新的构造
character(f2py_len=...)
来支持从包装函数返回假定长度的字符串(例如character(len=*)
)
引入了一个钩子来支持在读取所有输入文件后重写f2py
内部数据结构。例如,在 SciPy 支持的 BC 中,字符参数被视为C
表达式中的字符串参数是必需的。
(gh-19388)
增加了对 zSystem(z13、z14、z15)的 SIMD 扩展的支持,通过通用内在函数接口。这种支持导致使用通用内在函数实现的所有 SIMD 内核的性能提升,包括以下操作:rint、floor、trunc、ceil、sqrt、absolute、square、reciprocal、tanh、sin、cos、equal、not_equal、greater、greater_equal、less、less_equal、maximum、minimum、fmax、fmin、argmax、argmin、add、subtract、multiply、divide。
(gh-20913)
在大多数情况下,NumPy 以前在进行转换时不会给出浮点警告或错误。例如,像这样的转换:
np.array([2e300]).astype(np.float32) # overflow for float32
np.array([np.inf]).astype(np.int64)
现在通常会给出浮点警告。这些警告应该警告浮点溢出发生。在将浮点值转换为整数时出现错误时,用户应该期望无效值警告。
用户可以使用np.errstate
修改这些警告的行为。
请注意,对于浮点到整数的转换,给出的确切警告可能取决于平台。例如:
arr = np.full(100, fill_value=1000, dtype=np.float64)
arr.astype(np.int8)
可能会给出等效于的结果(中间转换意味着没有警告):
arr.astype(np.int64).astype(np.int8)
可能返回未定义结果,并设置警告:
RuntimeWarning: invalid value encountered in cast
精确行为取决于 C99 标准及其在软件和硬件中的实现。
(gh-21437)
Fortran 标准要求使用value
属性声明的变量必须按值传递而不是按引用传递。F2PY 现在正确支持这种用法模式。因此,在 Fortran 代码中,integer, intent(in), value :: x
将生成正确的包装器。
(gh-21807)
位生成器的 pickle 格式已扩展,以允许每个位生成器在 pickling 期间提供自己的构造函数。NumPy 的先前版本仅支持使用 NumPy 提供的核心一组位生成器之一创建的Generator
实例的反序列化。尝试反序列化使用第三方位生成器的Generator
将失败,因为在反序列化期间使用的构造函数仅知道 NumPy 中包含的位生成器。
(gh-22014)
以前,np.arange(n, dtype=str)
函数对于n=1
和n=2
有效,但对于其他值的n
会引发一个非特定的异常消息。现在,它会引发一个TypeError,提示arange
不支持字符串数据类型:
>>> np.arange(2, dtype=str)
Traceback (most recent call last)
...
TypeError: arange() not supported for inputs with DType <class 'numpy.dtype[str_]'>.
(gh-22055)
现在在numpy.typing.ArrayLike
和numpy.typing.DTypeLike
中使用的协议已经正确标记为运行时可检查,使其更容易用于运行时类型检查。
(gh-22357)
-
生成的扩展模块不再使用已弃用的 NumPy-C API
-
改进了
f2py
生成的异常消息 -
大量的错误和
flake8
警告修复 -
在签名文件的 C 表达式中可以使用的各种 CPP 宏都以
f2py_
为前缀。例如,应该使用f2py_len(x)
而不是len(x)
-
引入了一个新的构造
character(f2py_len=...)
来支持从包装函数返回假定长度的字符串(例如character(len=*)
)。
引入了一个钩子来支持在读取所有输入文件后重写f2py
内部数据结构。例如,这对于 SciPy 支持的 BC 是必需的,其中字符参数在C
表达式中被视为字符串参数。
(gh-19388)
增加了对 zSystem(z13、z14、z15)的 SIMD 扩展的支持,通过通用内在函数接口。这种支持导致使用通用内在函数实现的所有 SIMD 内核的性能提升,包括以下操作:rint、floor、trunc、ceil、sqrt、absolute、square、reciprocal、tanh、sin、cos、equal、not_equal、greater、greater_equal、less、less_equal、maximum、minimum、fmax、fmin、argmax、argmin、add、subtract、multiply、divide。
(gh-20913)
在大多数情况下,NumPy 以前在转换过程中发生浮点警告或错误时并不会给出警告。例如,转换如下:
np.array([2e300]).astype(np.float32) # overflow for float32
np.array([np.inf]).astype(np.int64)
现在通常会给出浮点警告。这些警告应该警告浮点溢出发生。对于将浮点值转换为整数时出现的错误,用户应该期望无效值警告。
用户可以使用np.errstate
修改这些警告的行为。
请注意,对于浮点到整数的转换,给出的确切警告可能取决于平台。例如:
arr = np.full(100, fill_value=1000, dtype=np.float64)
arr.astype(np.int8)
可能会给出等效于的结果(中间转换意味着不会给出警告):
arr.astype(np.int64).astype(np.int8)
可能返回未定义的结果,并设置警告:
RuntimeWarning: invalid value encountered in cast
精确的行为取决于 C99 标准及其在软件和硬件中的实现。
(gh-21437)
Fortran 标准要求使用value
属性声明的变量必须按值传递而不是按引用传递。F2PY 现在正确支持这种用法模式。因此,Fortran 代码中的integer, intent(in), value :: x
将生成正确的包装器。
(gh-21807)
位生成器的 pickle 格式已扩展,允许每个位生成器在 pickling 期间提供自己的构造函数。以前的 NumPy 版本只支持使用 NumPy 提供的核心一组位生成器创建的Generator
实例进行 unpickling。尝试 unpickle 使用第三方位生成器的Generator
将失败,因为在 unpickling 期间使用的构造函数只知道 NumPy 中包含的位生成器。
(gh-22014)
以前,np.arange(n, dtype=str)
函数对于n=1
和n=2
有效,但对于其他值的n
会引发一个非特定的异常消息。现在,它会引发一个TypeError,提示arange
不支持字符串 dtype:
>>> np.arange(2, dtype=str)
Traceback (most recent call last)
...
TypeError: arange() not supported for inputs with DType <class 'numpy.dtype[str_]'>.
(gh-22055)
numpy.typing.ArrayLike
和numpy.typing.DTypeLike
中使用的协议现在正确标记为运行时可检查,使其更容易用于运行时类型检查器。
(gh-22357)
np.in1d
(被np.isin
使用)现在可以在传递两个整数数组时切换到更快的算法(速度提高超过 10 倍)。这通常会自动使用,但您可以使用kind="sort"
或kind="table"
来分别强制使用旧方法或新方法。
(gh-12065)
比较函数(numpy.equal
、numpy.not_equal
、numpy.less
、numpy.less_equal
、numpy.greater
和numpy.greater_equal
)现在更快,因为它们现在使用通用内在函数进行向量化。对于具有 SIMD 扩展 AVX512BW 的 CPU,整数、浮点和布尔数据类型的性能提升分别为 2.57 倍、1.65 倍和 19.15 倍(N=50000)。
(gh-21483)
np.in1d
(被np.isin
使用)现在可以在传递两个整数数组时切换到更快的算法(速度提高超过 10 倍)。这通常会自动使用,但您可以使用kind="sort"
或kind="table"
来分别强制使用旧方法或新方法。
(gh-12065)
比较函数(numpy.equal
,numpy.not_equal
,numpy.less
,numpy.less_equal
,numpy.greater
和numpy.greater_equal
)现在更快,因为它们现在使用通用指令集进行向量化。对于具有 SIMD 扩展 AVX512BW 的 CPU,整数、浮点和布尔数据类型的性能提升分别为 2.57 倍、1.65 倍和 19.15 倍(N=50000)。
(gh-21483)
标量和数组的整数除法溢出以前会提供RuntimeWarning
,返回值未定义,导致在罕见情况下崩溃:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: divide by zero encountered in floor_divide
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
整数除法溢出现在返回输入 dtype 的最小值,并引发以下RuntimeWarning
:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: overflow encountered in floor_divide
array([-2147483648, -2147483648, -2147483648, -2147483648, -2147483648,
-2147483648, -2147483648, -2147483648, -2147483648, -2147483648],
dtype=int32)
(gh-21506)
当使用copy=False
时,numpy.ma.masked_invalid
现在会就地修改输入的掩码数组。这使其表现与masked_where
完全相同,并更好地匹配文档。
(gh-22046)
NumPy 迭代器现在通过 Python 中的np.nditer
和 C 中的NpyIter
支持分配所有数组。在这种情况下,迭代器形状默认为()
。操作数的 dtype 必须提供,因为无法从其他输入中推断出“公共 dtype”。
(gh-22457)
标量和数组的整数除法溢出以前会提供RuntimeWarning
,返回值未定义,导致在罕见情况下崩溃:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: divide by zero encountered in floor_divide
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
整数除法溢出现在返回输入 dtype 的最小值,并引发以下RuntimeWarning
:
>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: overflow encountered in floor_divide
array([-2147483648, -2147483648, -2147483648, -2147483648, -2147483648,
-2147483648, -2147483648, -2147483648, -2147483648, -2147483648],
dtype=int32)
(gh-21506)
当使用copy=False
时,numpy.ma.masked_invalid
现在会就地修改输入的掩码数组。这使其表现与masked_where
完全相同,并更好地匹配文档。
(gh-22046)
NumPy 迭代器现在通过 Python 中的np.nditer
和 C 中的NpyIter
支持分配所有数组。在这种情况下,迭代器形状默认为()
。必须提供操作数的 dtype,因为无法从其他输入中推断出“公共 dtype”。
(gh-22457)