numpy 1.15.0是一个版本,具有异常数量的清理、许多旧函数的弃用以及许多现有函数的改进。请阅读下面的详细描述,看看您是否受到影响。
对于测试,我们已经切换到Pytest来代替不再维护的鼻框架。旧的基于鼻的接口仍然用于可能仍在使用它的下游项目。
此版本支持的Python版本是2.7、3.4-3.7。轮子与openblas v0.3.0相连,它可以修复numpy 1.14报告的一些linalg问题。
numpy已切换到pytest进行测试。
一个新的 numpy.printoptions 上下文管理器。
numpy.printoptions
柱状图函数的许多改进。
在python 2.7中支持unicode字段名。
改进了对Pypy的支持。
修复和改进 numpy.einsum .
numpy.einsum
numpy.gcd 和 numpy.lcm ,计算最大公因数和最小公倍数。
numpy.gcd
numpy.lcm
numpy.ma.stack , the numpy.stack 一般化为屏蔽数组的数组联接函数。
numpy.ma.stack
numpy.stack
numpy.quantile 函数,接口 percentile 不含100因子
numpy.quantile
percentile
numpy.nanquantile 函数,接口 nanpercentile 不含100因子
numpy.nanquantile
nanpercentile
numpy.printoptions ,一个上下文管理器,临时为 with 块::
with
>>> with np.printoptions(precision=2): ... print(np.array([2.0]) / 3) [0.67]
numpy.histogram_bin_edges ,一个函数,用于获取柱状图使用的箱边缘,而不需要计算柱状图。
numpy.histogram_bin_edges
C函数 npy_get_floatstatus_barrier 和 npy_clear_floatstatus_barrier 已添加以处理更改操作顺序的编译器优化。详情见下文。
内置的别名 pickle 函数被弃用,取而代之的是不负责任的 pickle.<func> 姓名:
pickle
pickle.<func>
numpy.loads
numpy.core.numeric.load
numpy.core.numeric.loads
numpy.ma.loads, numpy.ma.dumps
numpy.ma.load , numpy.ma.dump -当用字符串调用python 3时,这些函数已经失败。
不推荐使用除元组之外的任何多维索引。这意味着 ind = [slice(None), 0]; arr[ind] 应更改为元组,例如, ind = [slice(None), 0]; arr[tuple(ind)] 或 arr[(slice(None), 0)] . 为了避免表达式中的歧义,如 arr[[[0, 1], [0, 1]]] ,当前解释为 arr[array([0, 1]), array([0, 1])] ,这将被解释为 arr[array([[0, 1], [0, 1]])] 未来。
ind = [slice(None), 0]; arr[ind]
ind = [slice(None), 0]; arr[tuple(ind)]
arr[(slice(None), 0)]
arr[[[0, 1], [0, 1]]]
arr[array([0, 1]), array([0, 1])]
arr[array([[0, 1], [0, 1]])]
不推荐从以下子模块导入,将来将删除这些子模块。
numpy.testing.utils
numpy.testing.decorators
numpy.testing.nosetester
numpy.testing.noseclasses
numpy.core.umath_tests
给发电机 numpy.sum 现已弃用。这是无证行为,但有效。在此之前,它将计算生成器表达式的和。将来,它可能会返回不同的结果。使用 np.sum(np.from_iter(generator)) 或者内置的python sum 相反。
numpy.sum
np.sum(np.from_iter(generator))
sum
C-API的用户应该调用 PyArrayResolveWriteBackIfCopy 或 PyArray_DiscardWritbackIfCopy 在任何具有 WRITEBACKIFCOPY 在取消分配数组之前设置标志。如果不在需要时使用这些调用,将发出拒绝警告。
PyArrayResolveWriteBackIfCopy
PyArray_DiscardWritbackIfCopy
WRITEBACKIFCOPY
用户 nditer 只要迭代器操作数中有一个是可写的,就应该将nditer对象用作上下文管理器,以便numpy可以管理写回语义,或者应该调用 it.close() . 一 RuntimeWarning 在这些情况下,可能会以其他方式排放。
nditer
it.close()
这个 normed 的参数 np.histogram ,很久以前在1.6.0中被弃用,现在发出 DeprecationWarning .
normed
np.histogram
DeprecationWarning
numpy 1.16将放弃对python 3.4的支持。
numpy 1.17将放弃对python 2.7的支持。
以下已编译模块已重命名并成为私有模块:
umath_tests -> _umath_tests
umath_tests
_umath_tests
test_rational -> _rational_tests
test_rational
_rational_tests
multiarray_tests -> _multiarray_tests
multiarray_tests
_multiarray_tests
struct_ufunc_test -> _struct_ufunc_tests
struct_ufunc_test
_struct_ufunc_tests
operand_flag_tests -> _operand_flag_tests
operand_flag_tests
_operand_flag_tests
这个 umath_tests 模块仍然可以向后兼容,但将来会被删除。
NpzFile
np.savez
collections.abc.Mapping
这意味着它的行为就像一个只读字典,并且有一个新的 .values() 方法及 len() 实施。
.values()
len()
对于python 3,这意味着 .iteritems() , .iterkeys() 已被否决,以及 .keys() 和 .items() 现在返回视图而不是列表。这与内置的 dict 类型在python 2和python 3之间更改。
.iteritems()
.iterkeys()
.keys()
.items()
dict
当使用 numpy.nditer 与 "writeonly" 或 "readwrite" 标记,在某些情况下,nditer实际上没有为您提供可写数组的视图。相反,它会给您一个副本,如果您对副本进行了更改,nditer稍后会将这些更改写回您的实际数组。目前,当数组对象被垃圾收集时,就会发生这种写回操作,这使得这个API错误在cpython上很容易发生,而在pypy上则完全被破坏。因此, nditer 现在应在与可写数组一起使用时用作上下文管理器,例如, with np.nditer(...) as it: ... . 你也可以直接打电话 it.close() 对于上下文管理器不可用的情况,例如在生成器表达式中。
numpy.nditer
"writeonly"
"readwrite"
with np.nditer(...) as it: ...
上一次鼻释放是2015年6月的1.3.7,该工具的开发已经结束,因此numpy现在已经转向使用pytest。一些下游项目以前使用的旧装饰器和鼻工具仍然可用,但不会得到维护。标准测试工具, assert_almost_equal 这样,除了鼻子特定的功能外,不会受到这种变化的影响。 import_nose 和 raises . 这些函数不在numpy中使用,而是为下游兼容性而保留。
assert_almost_equal
import_nose
raises
ctypes
__array_interface__
以前添加了numpy __array_interface__ 所有整数类型的属性 ctypes .
np.ma.notmasked_contiguous
np.ma.flatnotmasked_contiguous
这是文档化的行为,但以前的结果可能是slice、none或list中的任何一个。
所有下游用户似乎都在检查 None 从结果 flatnotmasked_contiguous 换成 [] . 这些呼叫者将像以前一样继续工作。
None
flatnotmasked_contiguous
[]
np.squeeze
axis
版本之前 1.7.0 , numpy.squeeze 没有一个 axis 默认情况下,参数和所有空轴都被删除。合并 axis 参数使得有选择地挤压单个或多个空轴成为可能,但是旧的API期望没有得到满足,因为仍然可以有选择地从期望删除所有空轴的对象中删除轴(无声成功)。对于期望旧行为的对象,可以无提示、选择性地删除空轴,这已得到修复,并且恢复了旧行为。
1.7.0
numpy.squeeze
.item
.item 现在返回 bytes 对象,而不是缓冲区或字节数组。这可能会影响假定返回值是可变的代码,这种情况已不再如此。
bytes
copy.copy
copy.deepcopy
masked
自从 np.ma.masked 是只读标量,复制应为非操作。这些函数现在的行为与 np.copy() .
np.ma.masked
np.copy()
结构化数组的多字段索引返回视图而不是副本的更改被推回到1.16。一种新方法 numpy.lib.recfunctions.repack_fields 已经被介绍来帮助减轻这种变化的影响,它可以用来编写与numpy 1.15和1.16兼容的代码。有关如何将代码更新为将来更改的帐户的详细信息,请参阅 user guide _.
numpy.lib.recfunctions.repack_fields
npy_get_floatstatus_barrier
npy_clear_floatstatus_barrier
功能 npy_get_floatstatus_barrier 和 npy_clear_floatstatus_barrier 已添加,应用于替代 npy_get_floatstatus 和 npy_clear_status 功能。优化编译器(如gcc 8.1和clang)正在重新排列操作顺序,因为在ufunc simd函数中使用了以前的函数,从而在运行我们要检查其状态的操作之前检查floatstatus标志。见 #10339 _.
npy_get_floatstatus
npy_clear_status
PyArray_GetDTypeTransferFunction
PyArray_GetDTypeTransferFunction now defaults to using user-defined copyswapn / copyswap for user-defined dtypes. If this causes a significant performance hit, consider implementing copyswapn to reflect the implementation of PyArray_GetStridedCopyFn. See #10898 .
copyswapn
copyswap
PyArray_GetStridedCopyFn
np.gcd
np.lcm
它们分别计算最大公因数和最小公倍数。这些工作在所有numpy整数类型上,以及内置的任意精度上。 Decimal 和 long 类型。
Decimal
long
已修改生成系统以添加对 _PYTHON_HOST_PLATFORM 环境变量,由使用 distutils 在一个平台上为另一个平台编译时。这使得为iOS目标编译numpy成为可能。
_PYTHON_HOST_PLATFORM
distutils
这只允许您一次为一个特定的平台编译numpy。创建一个完整的与iOS兼容的numpy包需要为iOS支持的5个体系结构(i386、x86_64、armv7、armv7s和arm64)构建,并将这5个编译的构建产品组合成一个“胖”二进制文件。
return_indices
np.intersect1d
新关键词 return_indices 返回与公共元素对应的两个输入数组的索引。
np.quantile
np.nanquantile
喜欢 np.percentile 和 np.nanpercentile 但接受分位数 [0, 1] 而不是百分位数 [0, 100] . np.percentile 现在是一个薄包装 np.quantile 加上除以100的步骤。
np.percentile
np.nanpercentile
增加了对64位RISC-V体系结构的实验支持。
np.einsum
同步einsum路径优化技术 numpy 和 opt_einsum . 尤其是, greedy @jcmgray对path进行了许多增强。已修复问题的完整列表包括:
numpy
任意内存可以传递到 greedy 路径。修正GH-11210。
贪婪的路径已经被更新为包含更多的动态编程思想,以防止大量重复(而且代价高昂)调用,从而找出发生的实际对收缩。现在需要对几百个输入张量进行几秒钟的运算。对矩阵产品状态理论有用。
将在GH-11218 GH-10352中发现的广播点错误捕获重新处理为在此过程中稍早一点。
增强了 can_dot 以前错过了边缘案例的功能(GH-11308的一部分)。
np.ufunc.reduce
np.ufunc.reduce , np.sum , np.prod , np.min 和 np.max 现在全部接受 initial 关键字参数,指定要开始缩减的值。
np.sum
np.prod
np.min
np.max
initial
np.flip
np.flip 现在在它的 axis 参数。如果轴为“无”,它将翻转所有轴。
histogram
histogramdd
np.lib.histograms
最初发现于 np.lib.function_base . 它们在它们的无范围内仍然可用 np.histogram(dd) 名称并保持兼容性,别名为 np.lib.function_base.histogram(dd) .
np.lib.function_base
np.histogram(dd)
np.lib.function_base.histogram(dd)
代码执行 from np.lib.function_base import * 将需要更新新位置,并且应考虑不使用 import * 将来。
from np.lib.function_base import *
import *
以前,当试图计算数据的有限范围时,它会失败。由于在显式给定存储箱时忽略了范围,因此此错误是不必要的。
注意呼叫 histogram 关于NaN值继续提高 RuntimeWarning S通常使用NaN值,可以像通常一样使用 errstate .
RuntimeWarning
errstate
日期、时间和时间增量现在可以用柱状图表示。垃圾箱边缘必须显式传递,并且尚未自动计算。
0的IQR不再导致 n_bins=1 ,而在这种情况下,选择的存储箱数量与数据大小有关。
n_bins=1
通过时 np.float16 , np.float32 或 np.longdouble 数据,返回的边现在是相同的数据类型。以前, histogram 仅当给定显式容器时返回相同的类型,并且 histogram 会产生 float64 不管输入什么,箱子都是。
np.float16
np.float32
np.longdouble
float64
这个 range 的参数 numpy.histogramdd 现在可以容纳 None 值指示应根据数据计算相应轴的范围。以前,不能以每轴为基础指定此项。
range
numpy.histogramdd
histogram2d
现在调用这些参数 density ,这与 histogram . 旧参数继续工作,但应首选新名称。
density
np.r_
np.ma.mr_
0d个数组传递给 r_ 和 mr_ 连接助手现在被视为长度为1的数组。以前,传递这些是一个错误。因此, numpy.ma.mr_ 现在可以在 masked 常数。
numpy.ma.mr_
np.ptp
keepdims
np.ptp (峰对峰)现在可以在多个轴上工作,就像 np.max 和 np.min .
MaskedArray.astype
ndarray.astype
这意味着它采用了所有相同的参数,使得为ndarray编写的更多代码也适用于屏蔽数组。
更改为simd.inc.src以允许在编译时使用avx2或avx512。以前用-march=native编译avx2(或512)时,即使其他代码得到avx2,也会为simd函数使用sse代码。
nan_to_num
以前,为整数标量输入返回了一个数组,这与float输入和ufunc的行为不一致。对于所有类型的标量或0d输入,结果现在是一个标量。
np.flatnonzero
np.flatnonzero 现在使用 np.ravel(a) 而不是 a.ravel() 因此它适用于列表、元组等。
np.ravel(a)
a.ravel()
np.interp
以前 np.interp(0.5, [0, 1], [10, 20]) 将返回 float ,但现在它返回 np.float64 对象,它更接近于其他函数的行为。
np.interp(0.5, [0, 1], [10, 20])
float
np.float64
另外,特殊情况 np.interp(object_array_0d, ...) 不再支持,因为 np.interp(object_array_nd) 反正也不支持。
np.interp(object_array_0d, ...)
np.interp(object_array_nd)
由于这一变化, period 参数现在可以用于0d数组。
period
以前 np.dtype([(u'name', float)]) 会提高 TypeError 在Python2中,因为字段名中只允许使用字节字符串。现在,任何Unicode字符串字段名都将使用 ascii 编解码器,引发 UnicodeEncodeError 失败后。
np.dtype([(u'name', float)])
TypeError
ascii
UnicodeEncodeError
这种更改使得使用 from __future__ import unicode_literals 这将导致字符串文本字段名在python 2中引发类型错误。
from __future__ import unicode_literals
dtype=object
bool
这允许符号类型的对象数组,这些对象数组将覆盖 == 以及返回表达式的其他运算符,以便与 np.equal(a, b, dtype=object) .
==
np.equal(a, b, dtype=object)
sort
kind='stable'
到目前为止,要对数据执行稳定的排序,用户必须执行以下操作:
>>> np.sort([5, 2, 6, 2, 1], kind='mergesort') [1, 2, 2, 5, 6]
因为合并排序是numpy中唯一可用的稳定排序算法。但是,拥有kind='mergesort'并不能明确表示用户希望执行稳定的排序,从而损害可读性。
此更改允许用户指定kind='stable',从而澄清意图。
当UFunc执行累加时,由于输入和输出之间的重叠,它们不再进行临时复制,也就是说,在将累加的结果存储到位之前,会添加下一个累积的元素,因此重叠是安全的。避免复制会加快执行速度。
linalg.matrix_power
和其他功能一样 linalg , matrix_power 现在可以处理尺寸大于2的数组,这些数组被视为矩阵的堆栈。作为更改的一部分,为了进一步提高一致性,第一个参数的名称已更改为 a (从 M ,非方形矩阵的例外情况已更改为 LinAlgError (从 ValueError )
linalg
matrix_power
a
M
LinAlgError
ValueError
random.permutation
permutation 使用快速通道 random.shuffle 对于所有输入数组维度。以前,快速路径仅用于一维数组。
permutation
random.shuffle
axes
可以通过传入 axes 参数,具有特定轴索引的元组列表。例如,对于签名 (i,j),(j,k)->(i,k) 适用于矩阵乘法,基元素是二维矩阵,它们被视为存储在每个参数的最后两个轴中。相应的axs关键字将是 [(-2, -1), (-2, -1), (-2, -1)] . 如果要使用前导尺寸,可以传入 [(0, 1), (0, 1), (0, 1)] .
(i,j),(j,k)->(i,k)
[(-2, -1), (-2, -1), (-2, -1)]
[(0, 1), (0, 1), (0, 1)]
为简单起见,对于在一维数组(向量)上操作的广义UFunc,接受单个整数而不是单个元素元组,对于所有输出都是标量的广义UFunc,可以省略(空)输出元组。因此,为了签署 (i),(i)->() 适合内部产品,可以通过 axes=[0, 0] 指示向量存储在两个输入参数的第一个维度中。
(i),(i)->()
axes=[0, 0]
作为与约简相似的广义UFunc的一个捷径,即作用于一个单一的、共享的核心维度(如上面的内部产品示例),可以通过 axis 参数。这相当于传球 axes 对于具有该核心维度的所有参数(例如,上面的示例, axes=[(axis,), (axis,)] )
axes=[(axis,), (axis,)]
此外,和约简一样,对于具有相同核心维度数的输入和不具有核心维度的输出的通用UFunc,可以传入 keepdims 在输出中保留尺寸为1的尺寸,从而允许对原始输入进行适当的广播。额外尺寸的位置可通过 axes . 例如,对于内部产品示例, keepdims=True, axes=[-2, -2, -2] 将根据内部产品示例进行操作, keepdims=True, axis=-2 将作用于输入参数的最后一个维度,并在输出中的该位置保留大小为1的维度。
keepdims=True, axes=[-2, -2, -2]
keepdims=True, axis=-2
以前在PPC上打印float128值是错误的,因为这些系统上的特殊双双浮点格式没有考虑在内。float128s现在以正确的舍入和唯一性进行打印。
向PPC用户发出警告:如果glibc版本<=2.23,则应升级它,特别是使用float128时。在PPC上,这些版本中glibc的malloc经常会不对齐分配的内存,当使用float128值时,这些内存可能会崩溃。
np.take_along_axis
np.put_along_axis
当用于多维数组时, argsort , argmin , argmax 和 argpartition 返回难以用作索引的数组。 take_along_axis 提供一种使用这些索引在数组中查找值的简单方法,以便:
argsort
argmin
argmax
argpartition
take_along_axis
np.take_along_axis(a, np.argsort(a, axis=axis), axis=axis)
与以下内容相同:
np.sort(a, axis=axis)
np.put_along_axis 作为在数组中写入这些索引的双重操作。