这个版本支持python 2.7和3.4-3.6。
numpy 1.12.0版本包含大量的修复和改进,但很少有比其他版本更突出的版本。这使得挑选突出部分有些武断,但以下内容可能会引起特别关注,或者指出可能会产生未来后果的领域。
操作顺序 np.einsum 现在可以优化为大速度改进。
np.einsum
新的 signature 参数 np.vectorize 用于核心尺寸的矢量化。
signature
np.vectorize
这个 keepdims 参数被添加到许多函数中。
keepdims
用于测试警告的新上下文管理器
支持numpy.distutils中的blis
对Pypy的支持有很大改进(尚未完成)
对python 2.6、3.2和3.3的支持已被放弃。
增加了对PYPY 2.7 v5.6.0的支持。未完成时 updateifcopy 尚不支持),这是Pypy的C-API兼容层的里程碑。
updateifcopy
将保留库顺序,而不是重新排序以匹配目录的顺序。
data
如GH-7083所指出的,分配“data”属性是一种固有的不安全操作。这种能力将在未来被移除。
linspace
np.linspace 当num不能安全地解释为整数时,现在引发deprecationwarning。
np.linspace
binary_repr
如果传入了“width”参数 binary_repr 它不足以表示基2(正)或2的补码(负)形式中的数字,该函数用于静默地忽略参数,并使用所讨论形式所需的最小位数返回表示。从用户的角度来看,这种行为现在被认为是不安全的,并且在将来会引发错误。
在1.13中,除了 NAT != NAT 这是真的。简而言之,Nat的行为就像Nan
NAT != NAT
1.13 np.average 将保留子类,以匹配大多数其他numpy函数(如np.mean)的行为。特别是,这意味着返回标量的调用可能会返回一个0-D子类对象。
np.average
在1.13中,涉及多个字段的结构化数组的行为将以两种方式发生变化:
首先,用多个字段(例如, arr[['f1', 'f3']] )将视图返回到1.13中的原始数组中,而不是一个副本。注意,返回的视图将具有与原始数组中的中间字段相对应的额外填充字节,这与1.12中的副本不同,后者将影响代码,如 arr[['f1', 'f3']].view(newdtype) .
arr[['f1', 'f3']]
arr[['f1', 'f3']].view(newdtype)
其次,对于numpy版本1.6到1.12,结构化数组之间的赋值“按字段名称”发生:目标数组中的字段设置为源数组中同名的字段,或者如果源没有字段,则设置为0::
>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')]) >>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')]) >>> b[:] = a >>> b array([(0, 2, 1), (0, 4, 3)], dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')])
在1.13中,分配将改为“按位置”:目的地的第n个字段将设置为源的第n个字段,而不管字段名如何。旧行为可以通过在分配前使用索引对字段重新排序来获得,例如, b[['x', 'y']] = a[['y', 'x']] .
b[['x', 'y']] = a[['y', 'x']]
带浮动上升的索引 IndexError ,例如 [0,0] .
IndexError
使用非整数数组类提升进行索引 IndexError ,例如, a['1', '2']
a['1', '2']
使用多个省略号进行索引引发 IndexError ,例如, a[..., ...] .
a[..., ...]
用作索引值的非整数提升 TypeError ,例如,在 reshape , take ,并指定减少轴。
TypeError
reshape
take
np.full 现在,如果没有给定dtype,则返回填充值的dtype数组,而不是默认为float。
np.full
np.average 如果参数是ndarray的子类,将发出警告,因为子类将从1.13开始保留。(见未来变化)
power
**
前面的行为取决于是否涉及numpy标量整数或numpy整数数组。
对于数组
零到负整数幂返回最小整数值。
负整数幂的1,-1都返回了正确的值。
其余整数在升序为负整数幂时返回零。
标量
剩余的整数有时返回零,有时根据整数类型组合返回正确的浮点。
所有这些案例现在都提出了 ValueError 除了那些常见类型为float的整数组合,例如uint64和int8。人们认为简单的规则是最好的方法,而不是对整数单位有特殊的例外。如果你需要负的力量,使用不精确的类型。
ValueError
这将对假定为 F_CONTIGUOUS 和 C_CONTIGUOUS 是互斥的,可以设置为确定现在两者都是的数组的默认顺序。
F_CONTIGUOUS
C_CONTIGUOUS
np.percentile
“中点”插补器现在给出的结果与“较低”和“较高”的结果相同。以前的行为'lower'+0.5是固定的。
numpy函数 keepdims 现在,Kwarg将值传递给Ndarray子类上的相应方法。以前 keepdims 关键字将被静默删除。这些函数现在具有以下行为:
如果用户不提供 keepdims ,没有向基础方法传递关键字。
任何用户提供的值 keepdims 作为关键字参数传递给方法。
如果方法不支持 keepdims Kwarg和用户明确传递 keepdims .
以下功能已更改: sum , product , sometrue , alltrue , any , all , amax , amin , prod , mean , std , var , nanmin , nanmax , nansum , nanprod , nanmean , nanmedian , nanvar , nanstd
sum
product
sometrue
alltrue
any
all
amax
amin
prod
mean
std
var
nanmin
nanmax
nansum
nanprod
nanmean
nanmedian
nanvar
nanstd
bitwise_and
以前的身份是1,现在是-1。有关更多说明,请参见改进中的条目。
类似于未屏蔽中值 ma.median 现在发出运行时警告并返回 NaN 在切片中 NaN 是存在的。
assert_almost_equal
scalars的精度检查已更改为与数组的精度检查相匹配。现在是:
abs(actual - desired) < 1.5 * 10**(-decimal)
请注意,这比以前记录的要宽松,但与中使用的以前的实现一致。 assert_array_almost_equal . 由于实现的变化,一些非常微妙的测试可能会失败,而这在以前没有失败过。
assert_array_almost_equal
NoseTester
什么时候? raise_warnings="develop" 如果给出,所有未捕获的警告现在将被视为测试失败。以前只有选定的被提升。在与默认的python设置类似的测试周期中,将显示一次未捕获或引发的警告(主要是在发布模式下)。
raise_warnings="develop"
assert_warns
deprecated
这个 assert_warns 函数和上下文管理器现在更特定于给定的警告类别。这种增加的特异性导致它们根据外部警告设置进行处理。这意味着,如果在上下文之外给出错误的类别警告并忽略,则不会发出警告。另外,特异性的增加可能意味着错误忽略的警告将被显示或提出。另请参见新的 suppress_warnings 上下文管理器。同样的情况也适用于 deprecated 装饰者。
suppress_warnings
没有变化。
as_strided
np.lib.stride_tricks.as_strided 现在有一个 writeable 关键字参数。如果不希望对返回的数组执行写操作,以避免意外的不可预测的写操作,则可以将其设置为false。
np.lib.stride_tricks.as_strided
writeable
axes
rot90
这个 axes 中的关键字参数 rot90 确定数组在其中旋转的平面。它默认为 axes=(0,1) 和原来的功能一样。
axes=(0,1)
flip
flipud 和 fliplr 沿轴=0和轴=1分别反转数组元素。新增 flip 函数沿任意给定轴反转数组元素。
flipud
fliplr
np.count_nonzero 现在有一个 axis 参数,允许在非平面数组对象上生成非零计数。
np.count_nonzero
axis
numpy.distutils
现在支持根据BLIS库提供的BLAS实现进行构建。见 [blis] 段在 site.cfg.example (在numpy repo或源分布的根目录中)。
[blis]
site.cfg.example
numpy/__init__.py
numpy的二进制分布可能需要在numpy初始化期间运行特定的硬件检查或加载特定的库。例如,如果我们使用需要SSE2指令的BLAS库分发numpy,我们希望检查运行numpy的计算机是否具有SSE2,以便给出信息性错误。
添加钩子 numpy/__init__.py 导入一个 numpy/_distributor_init.py 在标准numpy源文件中保持为空(bar a docstring)的文件,但可以被进行numpy二进制分发的人覆盖。
numpy/_distributor_init.py
nancumsum
nancumprod
南函数 nancumsum 和 nancumprod 已添加到计算中 cumsum 和 cumprod 忽略了奶奶。
cumsum
cumprod
np.interp
np.lib.interp(x, xp, fp) 现在允许插入数组 fp 复杂的,将插入 complex128 精度。
np.lib.interp(x, xp, fp)
fp
complex128
polyvalfromroots
新功能 polyvalfromroots 从多项式的根计算给定点的多项式。这对于高阶多项式很有用,因为在机器精度下,将其扩展为多项式系数是不准确的。
geomspace
新功能 geomspace 生成几何序列。它类似于 logspace ,但直接指定启动和停止: geomspace(start, stop) 行为与 logspace(log10(start), log10(stop)) .
logspace
geomspace(start, stop)
logspace(log10(start), log10(stop))
新的上下文管理器 suppress_warnings 已添加到测试实用程序。此上下文管理器旨在帮助可靠地测试警告。特别是可靠地过滤/忽略警告。在3.4.x之前的python版本中使用“忽略”过滤器忽略警告会很快导致这些(或类似的)警告无法可靠地测试。
上下文管理器允许过滤(以及记录)类似于 catch_warnings 但允许更容易的特异性。另外,打印尚未筛选或嵌套上下文管理器的警告将按预期工作。此外,可以将上下文管理器用作修饰器,当多个测试需要隐藏同一个警告时,这种修饰器很有用。
catch_warnings
ma.convolve
ma.correlate
这些函数包装了非屏蔽版本,但通过屏蔽值传播。有两种不同的传播模式。默认值会导致屏蔽值用屏蔽污染结果,但其他模式仅在没有其他选择时输出屏蔽。
float_power
新的 float_power ufunc就像 power 除所有计算外,函数的最小精度为float64。关于如何将整数处理为负整数幂的 NumPy 邮件列表进行了长时间的讨论,一个流行的建议是 __pow__ 操作员应始终返回至少float64精度的结果。这个 float_power 函数实现该选项。注意,它不支持对象数组。
__pow__
np.loadtxt
usecol
而不是使用 usecol=(n,) 要读取文件的第n列,现在允许使用 usecol=n . 此外,当将非整数作为列索引传递时,错误消息对用户更为友好。
usecol=(n,)
usecol=n
histogram
将“Doane”和“sqrt”估计量添加到 histogram 通过 bins 参数。增加了对范围受限柱状图的支持和自动bin估计。
bins
np.roll
这个 shift 和 axis 论据 roll 现在相互广播,并且每个指定轴都相应地移动。
shift
roll
__complex__
调用 complex() 在一个大小为1的数组上,现在将强制转换为一个Python复杂体。
complex()
pathlib.Path
标准 np.load , np.save , np.loadtxt , np.savez 和类似的功能现在可以 pathlib.Path 对象作为参数,而不是文件名或打开文件对象。
np.load
np.save
np.savez
bits
np.finfo
这使得 np.finfo 符合 np.iinfo 已经有了这个属性。
np.iinfo
此参数允许以numpy的样式向量化具有核心维度的用户定义函数 generalized universal functions . 这允许对更广泛的函数类进行矢量化。例如,结合两个向量生成标量的任意距离度量可以用 signature='(n),(n)->()' . 见 np.vectorize 详细信息。
signature='(n),(n)->()'
为了帮助人们将代码库从python 2迁移到python 3,python解释器有一个方便的选项-3,它在运行时发出警告。其中一个警告是整数除法:
$ python -3 -c "2/3" -c:1: DeprecationWarning: classic int division
在Python3中,新的整数除法语义也适用于numpy数组。对于此版本,numpy将发出类似的警告::
$ python -3 -c "import numpy as np; np.array(2)/np.array(3)" -c:1: DeprecationWarning: numpy: classic int division
以前,它在python2上包含str(字节)和unicode,但在python3上只包含str(unicode)。
前一个标识是1,结果是在使用reduce方法时,除了lsb之外的所有位都被屏蔽。新的标识是-1,它应该在两个补码机器上正常工作,因为所有的位都将设置为1。
包括大多数linalg模块在内的通用ufuncs现在将解锁python全局解释器锁。
高速缓存 np.fft 这就加速了同样长度的连续快速傅立叶变换,不再是无界增长。它们已被替换为LRU(最近使用最少的)缓存,如果达到内存大小或项目计数限制,这些缓存将自动收回不再需要的项目。
修复了几个明确禁止使用零宽度字符串数据类型的数组的接口(即 dtype('S0') 或 dtype('U0') 并修复了一些未正确处理此类数据类型的错误。特别是,改变了 ndarray.__new__ 不隐式转换 dtype('S0') 到 dtype('S1') (对于Unicode也是如此)创建新数组时。
dtype('S0')
dtype('U0')
ndarray.__new__
dtype('S1')
如果CPU在运行时支持它,那么基本整数ufunc现在使用avx2指令。此功能当前仅在使用gcc编译时可用。
np.einsum 现在支持 optimize 优化收缩顺序的论点。例如, np.einsum 将完成链点示例 np.einsum(‘ij,jk,kl->il’, a, b, c) 在一个单一的通道中 N^4 然而,当 optimize=True np.einsum 将创建一个中间数组以将此缩放比例减少到 N^3 或有效地 np.dot(a, b).dot(c) . 中间张量的使用,以减少比例已应用于一般的einsum和符号。见 np.einsum_path 了解更多详细信息。
optimize
np.einsum(‘ij,jk,kl->il’, a, b, c)
N^4
optimize=True
N^3
np.dot(a, b).dot(c)
np.einsum_path
流沙式的 np.sort 和 np.argsort 现在是一个IntroSort,它是常规的QuickSort,但是在没有足够的进展时会变为Heapsort。这将保留良好的快速排序性能,同时将最坏情况下的运行时从 O(N^2) 到 O(N*log(N)) .
np.sort
np.argsort
O(N^2)
O(N*log(N))
ediff1d
EDIF1D函数使用数组代替简单迭代器进行减法运算。当“开始”或“结束”不是“无”时,执行减法以消除复制操作。一个副作用是某些子类处理得更好,即astropy.quantity,因为创建、包装完整的数组,然后设置开始和结束值,而不是使用concatenate。
ndarray.mean
为了提高精度,现在在float32中计算float16阵列的平均值。这在诸如theano这样的包装中应该很有用,因为float16的精度足够,而且其较小的占地面积是可取的。
在内部,fromNumeric.py中的许多类似数组的方法都是使用位置参数调用的,而不是像外部签名那样使用关键字参数。这导致下游“熊猫”类库出现了一个与“numpy”兼容的问题。现在,这个模块中所有类似数组的方法都用关键字参数来调用。
以前对memmap对象的操作会错误地返回memmap实例,即使结果实际上不是memmapped。例如, arr + 1 或 arr + arr 将返回memmap实例,尽管输出数组中没有内存是memmapped。版本1.12从这些操作返回普通的numpy数组。
arr + 1
arr + arr
此外,还减少了memmap(例如 .sum(axis=None )现在返回numpy标量而不是0d memmap。
.sum(axis=None
基于python的警告的stacklevel增加了,因此大多数警告都会报告用户代码中有问题的行,而不是给出警告本身的行。现在测试stacklevel的传递,以确保新的警告将收到 stacklevel 参数。
stacklevel
这将导致对每个有问题的用户代码行或用户模块显示一次带有“默认”或“模块”筛选器的警告,而不是只显示一次。在3.4之前的Python版本中,这可能会导致出现以前被错误忽略的警告,这可能会让人感到惊讶,尤其是在测试套件中。