NumPy 1.10.0 发行说明#
此版本支持Python 2.6 - 2.7 和 3.2 - 3.5.
亮点#
numpy.distutils 现在支持通过传递给 setup.py build 的 –parallel/-j 参数进行并行编译
numpy.distutils 现在支持通过 site.cfg 进行额外的自定义,以控制编译参数,即运行时库,额外的链接/编译标志.
新增 np.linalg.multi_dot:在单个函数调用中计算两个或多个数组的点积,同时自动选择最快的求值顺序.
新函数 np.stack 提供了一个通用接口,用于沿新轴连接一系列数组,补充了 np.concatenate 沿现有轴连接的功能.
将 nanprod 添加到 nanfunctions 集合中.
支持 Python 3.5 中的 ‘@’ 运算符.
已删除的支持#
_dotblas 模块已被删除.现在 Multiarray 中支持 CBLAS.
testcalcs.py 文件已被删除.
polytemplate.py 文件已被删除.
npy_PyFile_Dup 和 npy_PyFile_DupClose 已从 npy_3kcompat.h 中删除.
splitcmdline 已从 numpy/distutils/exec_command.py 中删除.
try_run 和 get_output 已从 numpy/distutils/command/config.py 中删除.
不再支持数组打印的 a._format 属性.
从 np.genfromtxt 中删除关键字
skiprows和missing.从 np.correlate 中删除关键字
old_behavior.
未来的变化#
在像
arr1 == arr2这样的数组比较中,许多涉及字符串或结构化 dtype 的极端情况过去会返回标量,现在会发出FutureWarning或DeprecationWarning,将来会更改为执行元素比较或引发错误.在
np.lib.split中,结果中的空数组始终具有维度(0,),无论被拆分数组的维度如何.在 Numpy 1.11 中,该行为将被更改,以便保留维度.自 Numpy 1.9 以来,针对此更改的FutureWarning已经存在,但由于一个 bug,有时不会发出警告,并且维度已被保留.SafeEval 类将在 Numpy 1.11 中删除.
alterdot 和 restoredot 函数将在 Numpy 1.11 中删除.
有关这些更改的更多详细信息,请参见下文.
兼容性说明#
默认转换规则变更#
就地操作的默认转换已更改为 'same_kind' .例如,如果 n 是一个整数数组,而 f 是一个浮点数数组,则 n += f 将导致 TypeError ,而在以前的 Numpy 版本中,浮点数将被静默转换为整数.在不太可能的情况下,示例代码不是实际的错误,可以通过将其重写为 np.add(n, f, out=n, casting='unsafe') 以向后兼容的方式进行更新.旧的 'unsafe' 默认设置自 Numpy 1.7 以来已被弃用.
numpy 版本字符串#
为了符合 PEP 440,开发版本的 numpy 版本字符串已从 x.y.z.dev-githash 更改为 x.y.z.dev0+githash (注意 +).
放宽步幅检查#
NPY_RELAXED_STRIDE_CHECKING 现在默认为 true.
更新:在 1.10.2 中,由于向后兼容性的原因,NPY_RELAXED_STRIDE_CHECKING 的默认值已更改为 false.在可以将其设为默认值之前,还需要更多时间.作为路线图的一部分,还增加了对 f_contiguous not c_contiguous 数组维度更改视图的弃用.
沿除 axis=0 之外的任何轴连接一维数组会引发 IndexError#
自 NumPy 1.7 以来,使用 axis != 0 会引发 DeprecationWarning,现在会引发错误.
np.ravel,np.diagonal 和 np.diag 现在保留子类型#
x.ravel() 和 np.ravel(x) 之间,以及 x.diagonal() 和 np.diagonal(x) 之间存在不一致的行为,方法保留子类型,而函数不保留. 这已得到修复,这些函数现在的行为类似于这些方法,保留子类型,矩阵除外. 矩阵是向后兼容的特例,并且仍然像以前一样返回一维数组. 如果您需要保留矩阵子类型,请使用方法而不是函数.
rollaxis 和 swapaxes 始终返回视图#
以前,除了在轴的顺序没有改变的情况下,会返回一个视图,在这种情况下,会返回输入数组. 现在在所有情况下都会返回一个视图.
nonzero 现在返回基本 ndarray#
之前,在 1-D 输入(返回基本 ndarray)和更高维度的输入(保留子类)之间存在不一致. 行为已统一,现在返回值将是基本 ndarray. 子类仍然可以通过提供自己的 nonzero 方法来覆盖此行为.
C API#
swapaxes 的更改也适用于 PyArray_SwapAxes C 函数,该函数现在在所有情况下都返回一个视图.
nonzero 的更改也适用于 PyArray_Nonzero C 函数,该函数现在在所有情况下都返回一个基本 ndarray.
dtype 结构 (PyArray_Descr) 在末尾有一个新的成员来缓存其哈希值. 这不应该影响任何编写良好的应用程序.
连接函数 DeprecationWarning 的更改也会影响 PyArray_ConcatenateArrays,
recarray 字段返回类型#
以前,通过属性和索引访问的 recarray 字段的返回类型不一致,并且字符串类型的字段作为 chararray 返回. 现在,通过属性或索引访问的字段,对于非结构化类型的字段,将返回 ndarray,对于结构化类型的字段,将返回 recarray. 值得注意的是,这会影响包含空格的字符串的 recarray,因为尾随空格会从 chararray 中修剪掉,但保留在字符串类型的 ndarray 中. 此外,现在继承了嵌套结构化字段的 dtype.type.
recarray 视图#
将 ndarray 视为 recarray 现在会自动将 dtype 转换为 np.record. 请参阅新的记录数组文档. 此外,使用非结构化 dtype 查看 recarray 不再将结果的类型转换为 ndarray - 结果将保持为 recarray.
ufunc 的“out”关键字参数现在接受数组元组#
使用 ufunc 的“out”关键字参数时,可以提供一个数组元组,每个 ufunc 输出一个. 对于具有单个输出的 ufunc,单个数组也是有效的“out”关键字参数. 以前可以在“out”关键字参数中提供单个数组,它将用作具有多个输出的 ufunc 的第一个输出,这已被弃用,现在将导致 DeprecationWarning ,将来会产生错误.
byte-array 索引现在引发 IndexError#
现在,在 Python 3 中使用字节字符串索引 ndarray 会引发 IndexError 而不是 ValueError.
包含带有数组的对象的 Masked arrays#
对于这种(罕见的)masked array,获取单个 masked 项不再返回损坏的 masked array,而是返回该项的完全 masked 版本.
当遇到无效值时,中位数发出警告并返回 nan#
类似于 mean,median 和 percentile,现在当切片中存在 NaN 时,会发出 RuntimeWarning 并返回 NaN . 要在忽略无效值的情况下计算中位数或百分位数,请使用新的 nanmedian 或 nanpercentile 函数.
numpy.ma.testutils 中可用的函数已更改#
numpy.testing 中的所有函数曾经都可以在 numpy.ma.testutils 中使用,但并非所有函数都被重新定义为可用于屏蔽数组. 现在,这些函数中的大多数已从 numpy.ma.testutils 中删除,仅保留了一小部分以保持向后兼容性. 从长远来看,这应该有助于避免错误地使用错误的函数,但可能会给某些人带来导入问题.
新特性#
从 site.cfg 读取额外的标志#
以前,只能通过 distutils 包中的代码更改来完成对依赖库和 numpy 本身编译的自定义. 现在,numpy.distutils 从 site.cfg 的每个组中读取以下额外标志:
runtime_library_dirs/rpath, 设置运行时库目录以覆盖LD_LIBRARY_PATH
extra_compile_args, 将额外的标志添加到源文件的编译中extra_link_args, 在链接库时添加额外的标志
这至少应该部分完成用户自定义.
np.cbrt 用于计算实浮点数的立方根#
np.cbrt 包装了 C99 立方根函数 cbrt. 与 np.power(x, 1./3.) 相比,它对于负实浮点数有明确的定义,并且速度更快一些.
numpy.distutils 现在允许并行编译#
通过将 –parallel=n or -j n 传递给 setup.py build,扩展的编译现在在 n 个并行进程中执行. 并行化仅限于一个扩展中的文件,因此使用 Cython 的项目将不会受益,因为它从单个文件构建扩展.
genfromtxt 有一个新的 max_rows 参数#
genfromtxt 中添加了一个 max_rows 参数,以限制在单个调用中读取的行数. 使用此功能,可以通过重复调用该函数来读取存储在单个文件中的多个数组.
用于调用数组广播的新函数 np.broadcast_to#
np.broadcast_to 根据 numpy 的广播规则手动将数组广播到给定的形状. 该功能类似于 broadcast_arrays,事实上,broadcast_arrays 已经被重写为在内部使用 broadcast_to,但只需要一个数组.
用于测试警告的新上下文管理器 clear_and_catch_warnings#
当 Python 发出警告时,它会将已发出此警告记录在导致警告的模块中,记录在一个模块属性 __warningregistry__ 中. 一旦发生这种情况,除非你清除 __warningregistry__ 中的相关条目,否则不可能再次发出警告.这使得测试警告变得困难和脆弱,因为如果你的测试在另一个已经导致警告的测试之后进行,你将无法发出警告或对其进行测试. 上下文管理器 clear_and_catch_warnings 在进入时清除模块注册表中的警告,并在退出时重置它们,这意味着可以重新引发警告.
cov 有新的 fweights 和 aweights 参数#
fweights 和 aweights 参数通过将两种类型的权重应用于观测向量,为协方差计算添加了新功能. fweights 数组表示每个观测向量的重复次数, aweights 数组提供它们的相对重要性或概率.
支持 Python 3.5+ 中的 ‘@’ 运算符#
Python 3.5 增加了对 PEP465 中提出的矩阵乘法运算符“@”的支持.已经实现了对该运算符的初步支持,并且还添加了一个等效函数 matmul ,用于测试目的以及在早期 Python 版本中使用.该函数是初步的,其可选参数的顺序和数量预计会发生变化.
fft 函数的新参数 norm#
默认的归一化使直接变换不缩放,而逆变换按 \(1/n\) 缩放.可以通过将关键字参数 norm 设置为 "ortho" (默认为 None )来获得酉变换,以便直接和逆变换都将按 \(1/\\sqrt{n}\) 缩放.
改进#
使用二分查找的 np.digitize#
np.digitize 现在是根据 np.searchsorted 实现的.这意味着使用二分查找对值进行分箱,与之前的线性查找相比,这对于更大的箱数而言,伸缩性更好.它还消除了对输入数组为一维的要求.
np.poly 现在将整数输入转换为浮点数#
np.poly 现在会将整数类型的一维输入数组转换为双精度浮点数,以防止计算首一多项式时发生整数溢出.仍然可以通过传入对象类型的数组来获得更高精度的结果,例如,使用 Python 整数填充.
np.interp 现在可以与周期函数一起使用#
np.interp 现在有一个新的参数 period,用于提供输入数据 xp 的周期.在这种情况下,输入数据会被正确地归一化到给定的周期,并且在 xp 的每个末端添加一个端点,以便闭合前一个和下一个周期循环,从而产生正确的插值行为.
np.pad 支持更多 pad_width 和 constant_values 的输入类型#
constant_values 参数现在接受 NumPy 数组和浮点值.NumPy 数组作为 pad_width 的输入受到支持,如果它的值不是整数类型,则会引发异常.
np.argmax 和 np.argmin 现在支持 out 参数#
为了与 ndarray.argmax 和 ndarray.argmin 保持一致, out 参数已添加到 np.argmax 和 np.argmin.新参数的行为与这些方法中的行为完全相同.
检测并使用了更多的系统 C99 复数函数#
现在检测到所有 in complex.h 的函数.以下函数有新的回退实现.
npy_ctan,
npy_cacos, npy_casin, npy_catan
npy_ccosh, npy_csinh, npy_ctanh,
npy_cacosh, npy_casinh, npy_catanh
由于这些改进,返回的值将会发生一些小的变化,特别是对于边界情况.
np.loadtxt 支持 float.hex 方法产生的字符串#
float.hex 产生的字符串看起来像 0x1.921fb54442d18p+1 ,所以这不是用于表示无符号整数类型的十六进制数.
np.isclose 正确处理整数 dtype 的最小值#
为了正确处理整数类型的最小值,np.isclose 现在将在比较期间转换为 float dtype.这使其行为与 np.allclose 提供的行为一致.
np.allclose 在内部使用 np.isclose.#
np.allclose 现在在内部使用 np.isclose,并通过设置 equal_nan=True 继承了将 NaN 作为相等值进行比较的能力.诸如 np.ma.MaskedArray 之类的子类现在也得到了保留.
np.genfromtxt 现在可以正确处理大整数#
现在,np.genfromtxt 可以正确处理 32 位系统上大于 231-1 和 64 位系统上大于 263-1 的整数(在以前的版本中,在这些情况下会崩溃并出现 OverflowError ).大于 263-1 的整数将转换为浮点数值.
np.load, np.save 具有 pickle 向后兼容性标志#
函数 np.load 和 np.save 具有额外的关键字参数,用于控制 pickled Python 对象的向后兼容性. 这使 Python 3 上的 Numpy 能够加载包含在 Python 2 上生成的对象数组的 npy 文件.
MaskedArray 支持更复杂的基类#
正在删除内置的基类行为类似于普通数组的假设.特别是,设置和获取元素和范围将尊重基类对 __setitem__ 和 __getitem__ 的重写,而算术运算将尊重对 __add__ , __sub__ 等的重写.
变更#
dotblas 功能已移至 multiarray#
dot,inner 和 vdot 的 cblas 版本已集成到 multiarray 模块中.特别是,vdot 现在是一个 multiarray 函数,以前不是.
更严格地检查 gufunc 签名一致性#
现在更严格地根据函数的签名检查广义通用函数的输入:现在要求所有核心维度都存在于输入数组中;具有相同标签的核心维度必须具有完全相同的大小;并且必须指定输出核心维度,可以通过相同的标签输入核心维度或通过传入的输出数组来指定.
从 np.einsum 返回的视图是可写的#
现在,只要输入数组是可写的,np.einsum 返回的视图就是可写的.
np.argmin 跳过 NaT 值#
np.argmin 现在跳过 datetime64 和 timedelta64 数组中的 NaT 值,使其与 np.min,np.argmax 和 np.max 一致.
弃用#
涉及字符串或结构化 dtypes 的数组比较#
通常,数组上的比较操作执行 elementwise 比较并返回布尔数组. 但是在某些极端情况下,特别是涉及字符串是结构化 dtypes,NumPy 历史上返回了一个标量. 例如:
### Current behaviour
np.arange(2) == "foo"
# -> False
np.arange(2) < "foo"
# -> True on Python 2, error on Python 3
np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> False
延续在 1.9 中开始的工作,在 1.10 中,这些比较现在将引发 FutureWarning 或 DeprecationWarning ,并且将来将对其进行修改,以与其他比较操作更加一致,例如:
### Future behaviour
np.arange(2) == "foo"
# -> array([False, False])
np.arange(2) < "foo"
# -> error, strings and numbers are not orderable
np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> [False, False]
SafeEval#
numpy/lib/utils.py 中的 SafeEval 类已弃用,将在下一个版本中删除.
alterdot, restoredot#
alterdot 和 restoredot 函数不再执行任何操作,并且已被弃用.
pkgload, PackageLoader#
这些加载包的方式现在已被弃用.
corrcoef 的 bias, ddof 参数#
corrcoef 函数的 bias 和 ddof 参数的值在相关系数隐含的除法中被取消,因此对返回的值没有影响.
我们现在弃用 corrcoef 和屏蔽数组版本 ma.corrcoef 的这些参数.
因为我们要弃用 ma.corrcoef 的 bias 参数,所以我们还弃用将 allow_masked 参数用作位置参数,因为它的位置会随着删除 bias 而改变. allow_masked 将在适当的时候成为仅关键字参数.
dtype 字符串表示形式更改#
自 1.6 以来,从其字符串表示形式(例如 'f4' )创建 dtype 对象,如果大小与现有类型不对应,则会发出弃用警告,并默认为创建该类型的默认大小的 dtype. 从此版本开始,现在将引发 TypeError .
唯一的例外是 object 数据类型,其中 'O4' 和 'O8' 仍会发出弃用警告.这种平台相关的表示将在下一个版本中引发错误.
为了准备即将到来的更改,object 数据类型的字符串表示形式,即 np.dtype(object).str ,不再包含项目大小,即返回 '|O' 而不是像以前一样返回 '|O4' 或 '|O8' .