NumPy 1.7.0 发行说明#
此版本包含多项新功能以及大量错误修复和重构。它支持Python 2.4 - 2.7和3.1 - 3.3,并且是支持Python 2.4 - 2.5的最后一个版本。
强调#
where=
ufuncs 的参数(允许使用布尔数组来选择应该在哪里进行计算)vectorize
改进(添加了“排除”和“缓存”关键字、常规清理和错误修复)numpy.random.choice
(随机样本生成函数)
兼容性说明#
在 numpy 的未来版本中,函数 np.diag、np.diagonal 和 ndarrays 的对角线方法将返回原始数组的视图,而不是像现在那样生成副本。如果您写入任何这些函数返回的数组,这会产生影响。为了促进这种转换,如果 numpy 1.7 检测到您可能正在尝试写入此类数组,则它会生成 FutureWarning。有关详细信息,请参阅 np.diagonal 的文档。
与上面的 np.diagonal 类似,在 numpy 的未来版本中,通过字段名称列表索引记录数组将返回原始数组的视图,而不是像现在那样生成副本。与 np.diagonal 一样,如果 numpy 1.7 检测到您可能正在尝试写入此类数组,则它会生成 FutureWarning。有关详细信息,请参阅数组索引文档。
在 numpy 的未来版本中,UFunc out= 参数的默认转换规则将从“unsafe”更改为“same_kind”。 (这也适用于像 a += b 这样的就地操作,相当于 np.add(a, b, out=a)。)大多数违反“same_kind”规则的用法都可能是错误,因此此更改可能会导致错误。暴露依赖于 NumPy 的项目中以前未检测到的错误。在此版本的 numpy 中,此类用法将继续成功,但会引发 DeprecationWarning。
全数组布尔索引已经过优化,可以使用不同的优化代码路径。此代码路径应产生相同的结果,但任何有关代码更改的反馈将不胜感激。
尝试写入只读数组(arr.flags.writeable
设置为 的数组False
)会不一致地引发 RuntimeError、ValueError 或 TypeError,具体取决于采用的代码路径。它现在持续引发 ValueError。
<ufunc>.reduce 函数以与以前版本的 NumPy 不同的顺序评估一些缩减,通常提供更高的性能。由于浮点运算的性质,这可能会微妙地改变一些结果,就像将 NumPy 链接到不同的 BLAS 实现(例如 MKL)一样。
如果从 1.5 升级,那么通常在 1.6 和 1.7 中添加了大量代码,并且更改了一些代码路径,特别是在类型解析和通用函数上的缓冲迭代领域。这可能会对您的代码产生影响,特别是如果您过go依赖于意外行为。
新功能#
约简 UFuncs 概括轴=参数#
任何 ufunc.reduce 函数调用以及其他缩减(例如 sum、prod、any、all、max 和 min)都支持选择要缩减的轴子集的功能。以前,可以说 axis=None 表示所有轴,或 axis=# 表示选择单个轴。现在,我们还可以说 axis=(#,#) 来选择要减少的轴列表。
减少 UFuncs 新 keepdims= 参数#
有一个新的 keepdims= 参数,如果将其设置为 True,则不会丢弃缩小轴,而是将它们设置为大小为 1。设置此选项后,归约结果将正确广播到被归约的原始操作数。
日期时间支持#
笔记
日期时间 API 在 1.7.0 中处于实验阶段,在 NumPy 的未来版本中可能会发生变化。
与 NumPy 1.6 相比,datetime64 进行了大量修复和增强:
解析器非常严格只接受 ISO 8601 日期,并有一些方便的扩展
单位之间正确转换
日期时间算术工作正常
工作日功能(允许在仅一周中的某些天有效的上下文中使用日期时间)
有关更多详细信息,请参阅doc/source/reference/arrays.datetime.rst中的注释(也可在arrays.datetime.html 的在线文档中找到)。
用于打印数组的自定义格式化程序#
formatter
查看函数的新参数numpy.set_printoptions
。
新函数 numpy.random.choice #
添加了通用采样函数,它将从给定的类似数组生成样本。样本可以有或没有替换,并且具有均匀或给定的非均匀概率。
新函数 isclose #
返回一个布尔数组,其中两个数组在容差范围内元素相等。可以指定相对和绝对公差。
多项式包中的初步多维支持#
轴关键字已添加到积分和微分函数中,张量关键字已添加到评估函数中。这些添加允许在这些函数中使用多维系数数组。用于评估网格或点集上的 2-D 和 3-D 系数数组的新函数与可用于拟合的 2-D 和 3-D 伪范德蒙德矩阵一起添加。
能够填充 n 列数组#
添加了包含用于填充 n 维数组的函数的 pad 模块。各种私有填充函数作为公共“pad”函数的选项公开。例子:
pad(a, 5, mode='mean')
当前模式有constant
、edge
、linear_ramp
、maximum
、
mean
、median
、minimum
、reflect
、symmetric
、wrap
和
<function>
。
searchsorted 的新参数#
函数 searchsorted 现在接受一个“排序器”参数,该参数是一个对要搜索的数组进行排序的排列数组。
构建系统#
添加了对 AArch64 架构的实验性支持。
CAPI #
新函数PyArray_FailUnlessWriteable
提供了一个一致的接口来检查数组的可写性 - 任何与 WRITEABLE 标志事先未知为 True 的数组一起使用的 C 代码,应确保在写入之前调用此函数。
添加了 NumPy C 风格指南 ( doc/C_STYLE_GUIDE.rst
)。
变化#
一般的#
函数 np.concatenate 尝试匹配其输入数组的布局。以前,布局不遵循任何特定原因,并且以不期望的方式依赖于选择用于串联的特定轴。还修复了一个错误,该错误默默地允许超出范围的轴参数。
ufunc 逻辑或、逻辑和和逻辑现在遵循 Python 的对象数组行为,而不是尝试调用对象上的方法。例如,表达式 (3 and 'test') 生成字符串 'test',现在 np.logic_and(np.array(3, 'O'), np.array('test', 'O')) 生成 '测试”也是如此。
ndarrays 上的属性.base
用于视图,以确保拥有内存的底层数组不会过早释放,现在,当您拥有视图的视图时,该属性会折叠出引用。例如:
a = np.arange(10)
b = a[1:]
c = b[1:]
在 numpy 1.6 中,c.base
是b
和c.base.base
是a
。在 numpy 1.7 中,
c.base
是a
.
为了提高依赖于旧行为的软件的向后兼容性.base
,我们仅“跳过”与新创建的视图具有完全相同类型的对象。如果您使用子类,这会有所不同ndarray
。例如,如果我们有ndarray
和对象的混合,matrix
它们都是同一原始对象的视图ndarray
:
a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]
那么d.base
将会是b
。这是因为d
是一个matrix
对象,因此只有遇到其他
matrix
对象时,折叠过程才会继续。它按该顺序
考虑c
、b
、 和,并且是该列表中作为对象的最后一个条目。a
b
matrix
选角规则#
由于 NA 相关的工作,在极端情况下,铸造规则发生了一些变化。特别是对于标量+标量的组合:
longlong类型( q ) 现在对于任何其他数字 ( ? bhilqp BHI ) 的操作保持longlong,之前它被转换为int_ ( l )。ulonglong类型 ( Q ) 现在保留为ulonglong而不是uint ( L )。
timedelta64类型( m ) 现在可以与任何整数类型 ( bhil qp BHILQP )混合,之前它会引发TypeError。
对于数组+标量,除了数组和标量是无符号/有符号整数的情况外,上述规则只是广播,然后结果将转换为数组类型(可能更大的尺寸),如下例所示:
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(257)).dtype
dtype('uint16')
>>> (np.zeros((2,), dtype=np.int8) + np.uint16(257)).dtype
dtype('int16')
>>> (np.zeros((2,), dtype=np.int16) + np.uint32(2**17)).dtype
dtype('int32')
大小是否增加取决于标量的大小,例如:
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(255)).dtype
dtype('uint8')
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(256)).dtype
dtype('uint16')
complex128
标量 +数组也float32
被转换为complex64
.
在 NumPy 1.7 中,必须通过显式指定类型作为第二个参数(例如 )来构造datetime64类型 ( M ) 。np.datetime64(2000, 'Y')
弃用#
一般的#
不推荐使用_format数组属性指定自定义字符串格式化程序。可以使用or
中的新格式化程序关键字来代替。numpy.set_printoptions
numpy.array2string
多项式包中已弃用的导入已被删除。
concatenate
现在如果 则引发一维数组的 DepractionWarning 。 numpy < 1.7.0 的版本忽略一维数组的轴参数值。我们现在允许这样做,但在适当的时候我们会提出错误。axis != 0
C-API #
不推荐直接访问 PyArrayObject* 的字段。对于许多版本,建议不要直接访问。作为 NumPy 2.0 的准备,预计未来 PyArray_Descr* 和其他核心对象也会出现类似的弃用。
old_defines.h 中的宏已弃用,并将在下一个主要版本 (>= 2.0) 中删除。 sed 脚本 tools/replace_old_macros.sed 可用于将这些宏替换为较新的版本。
您可以通过在包含任何 NumPy 标头之前添加由和 目标版本号(例如 )组成的行来针对已弃用的 C API 测试您的代码。#define NPY_NO_DEPRECATED_API
NPY_1_7_API_VERSION
NPY_CHAR
枚举成员已NPY_TYPES
弃用,并将在 NumPy 1.8 中删除。有关更多详细信息,请参阅gh-2801中的讨论
。