NumPy新版本发布了~~1.20.0横空出世

标签:#numpy##python# 时间:2021/01/31 16:31:21 作者:小木

简介

NumPy是Python中非常优秀的一个数据科学工具包,使用Python做数据分析的童鞋几乎是必备的工具。NumPy的提供了非常丰富的计算能力,但是底层是C语言实现的,因此既有Python语法的低门槛,速度上却依然非常好。NumPy本身也和Pandas、SciPy一起成为一种生态了。



今天,NumPy发布了1.20.0最新版本,这个版本的改动很大。值得童鞋们关注~

这个版本支持Python3.7-3.9(注意,3.6已经被抛弃了哦)。由184位贡献者实现了684个PRs。主要的变化如下:

  1. NumPy函数的注释。这项工作还在进行中,预计会在用户反馈的基础上进行改进。

  2. 更广泛地使用SIMD来提高ufuncs的执行速度。在引入通用函数方面已经做了很多工作,这些通用函数将方便在不同硬件平台上使用新功能。这项工作还在进行中。

  3. 对dtype和casting实现的改造,以便为扩展dtypes提供一个更容易的途径。这项工作还在进行中,但已经做了足够的实验和反馈。

  4. 广泛的文档改进,包括大约 185 个 PR 合并。这项工作正在进行中,是改进对新用户有用性的大项目的一部分。

  5. 进一步清理与移除 Python 2.7 有关的内容。这提高了代码的可读性,并消除了一些技术债务。

  6. 对即将到来的 Cython 3.0 的初步支持。

接下来,我们看看其中比较重要的一些内容

[TOC]

一、NumPy1.20.0的新函数

1.1、数组新的“洗牌”方法

首先我们看一下随机生成器里面新增的一个方法,即permuted方法。终于新增了一个这样实用的按维度随机重排数组的方法了。

在此之前已经有shuffle和permutation了,这两个方法是对数组进行进行随机重排列的方法,区别在于一个是数组本身重排列,另一个是重排列结果返回一个副本。但是这两个随机重排列的方法都只能针对数组中的某一个维度,也就是说只能随机重排某一个维度下的数组。对于多维数据,如二维数据为例,它只能让所有的行或者列都按一种方式重排。

如下的例子:

>>> rg = np.random.default_rng()
>>> x = np.arange(0, 15).reshape(3, 5)
>>> x
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> rg.permutation(x, axis=1)
array([[ 1,  3,  2,  0,  4],  # random
       [ 6,  8,  7,  5,  9],
       [11, 13, 12, 10, 14]])

可以看到,这种重排方式就是第0列变成了第3列,第2列变成了第0列,等等。

而新增的permuted方法则可以每一个维度独立重排。

>>> rg.permuted(x, axis=1)
array([[ 1,  0,  2,  4,  3],  # random
       [ 5,  7,  6,  9,  8],
       [10, 14, 12, 13, 11]])

可以看到,每一行都是相互独立的随机重排了。

1.2、新增滑动窗口查看方法

在一些与时间有关的问题中,滑动窗口是一个非常重要的工具,比如从某一个时刻开始,一次按照多少步长滑动,到下一个时刻的数据中。
新增的numpy.lib.stride_tricks.sliding_window_view 方法可以让我们按照这种方式去查看数据。此前,NumPy并没有提供这样的方法供我们使用,其它方法也都效率不太好。

当然这个问题本身就很麻烦,毕竟如果一个很大的序列,用一个窗口去滑动效率就不高,尤其是序列很长,窗口很小的时候,目前NumPy提供的这个方法算是一个比较高效的解决方案了。

示例如下:

>>> x = np.arange(6)
>>> x.shape
(6,)
>>> v = sliding_window_view(x, 3)
>>> v.shape
(4, 3)
>>> v
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4],
       [3, 4, 5]])

更多细节,就等童鞋们自己挖掘了。

1.3、新增broadcasting用户接口

broadcasting是数组计算中很重要的概念,在深度学习以及各种计算框架下,都使用了这样一个概念。它告诉我们如何处理不同形状之间数组的计算,一般来说,是较小的数组被broadcast较大的数组中计算。但是对于用户来说很多时候也许不太容易理解,这次新增的numpy.broadcast_shapes方法可以直接让我们看到不同形状的计算结果如何。

如下:

>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)

>>> np.broadcast_shapes(2, (3, 1))
(3, 2)

>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)

这可以帮助我们在构造计算时候更加清楚自己在做什么,真的是新手的福音啊。哈哈。

二、废弃的内容

这次新版本废弃的东西还是需要大家注意的。对于之前编码不太规范的童鞋来说,如果更新了,很多代码可能就有问题了。

2.1、废弃np.int

首先是np.int被废弃,这个是几乎等同于Python内置的int方法。但是对于新手来说很容易困惑,类似这样的方法还有np.float等。这次彻底废弃了,让大家不再困惑。

2.2、shape=None与shape=()开始不同

其次是方法中如果传递了shape=None的参数要注意,之前这个参数与shape=()是同等含义的。但是最新的方法中这两者已经有区别了。如果之前有混用要注意。

2.3、超出索引值报错

此外,如果索引为空的情况会被报错,之前超出索引的情况返回了0,未来会报错了。如下情况会报错,目前会告警大家,需要注意。

arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]

2.4、mode与searchside不支持错误拼写

之前对于一些错误的参数,NumPy自动更正,以后会报错了。如下:

import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap")  # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random')  # should be "right"

2.5、废弃numpy.dual

2.6、矩阵的outer方法被废弃

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送