前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >善用5个优雅的 Python NumPy 函数

善用5个优雅的 Python NumPy 函数

作者头像
AiTechYun
发布2019-11-11 13:03:57
1.1K0
发布2019-11-11 13:03:57
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
编辑 | sunlei 发布 | ATYUN订阅号

在机器学习和数据科学项目的日常数据处理中,我们会遇到一些特殊的情况,这些情况需要样板代码来解决。在此期间,根据大家的需要和使用情况,其中一些转换为核心语言或包本身提供的基本功能。这里我将分享5个优雅的python Numpy函数,它们可以用于高效和简洁的数据操作。

1) 使用-1进行整形

Numpy允许我们重新塑造一个矩阵,提供新的形状应该与原始形状兼容。这个新形状的一个有趣之处是,我们可以将形状参数设为-1。它只是意味着它是一个未知的维度,我们希望Numpy能够理解它。Numpy将通过查看“数组的长度和剩余维度”来确定它是否满足上述条件。现在我们来看一个例子。

一维为-1的不同图形的表示

代码语言:javascript
复制
a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])
a.shape
(2, 4)

假设我们将行设为1,把-1作为列,那么Numpy将能够找到列8。

代码语言:javascript
复制
a.reshape(1,-1)
array([[1, 2, 3, 4, 5, 6, 7, 8]])

假设我们将行设为-1,将1设为列,那么Numpy将能够找到行8。

代码语言:javascript
复制
a.reshape(-1,1)
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8]])

类似的情况也是可能的。

代码语言:javascript
复制
a.reshape(-1,4)
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
a.reshape(-1,2)
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])
a.reshape(2,-1)
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
a.reshape(4,-1)
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

这也适用于任何高阶张量的整形,但是只有一个维度可以被赋值为-1。

代码语言:javascript
复制
a.reshape(2,2,-1)
array([[[1, 2],
        [3, 4]],
       [[5, 6],
        [7, 8]]])
a.reshape(2,-1,1)
array([[[1],
        [2],
        [3],
        [4]],
       [[5],
        [6],
        [7],
        [8]]])

如果我们试图重新塑造一个不兼容的形状或一个以上的未知形状,那么将会出现一个错误消息。

代码语言:javascript
复制
a.reshape(-1,-1)
ValueError: can only specify one unknown dimension
a.reshape(3,-1)
ValueError: cannot reshape array of size 8 into shape (3,newaxis)

综上所述,在重塑数组时,新形状必须包含与旧形状相同数量的元素,这意味着两个形状的维度的乘积必须相等。当使用-1时,对应于-1的维数将是原始数组维数除以给定重塑的维数的乘积,以保持相同数量的元素。

2) Argpartition:查找数组中的N个最大值

Numpy有一个名为argpartition的函数,它可以有效地找到N个值中最大的索引和N个值。它提供索引,如果需要排序的值,则可以进行排序。

代码语言:javascript
复制
array = np.array([10, 7, 4, 3, 2, 2, 5, 9, 0, 4, 6, 0])
index = np.argpartition(array, -5)[-5:]
index
array([ 6, 1, 10, 7, 0], dtype=int64)
np.sort(array[index])
array([ 5, 6, 7, 9, 10])

3)Clip:如何将数组中的值保持在一个间隔内

在许多数据问题或算法(如PPO在强化学习)中,我们需要保持所有的值在一个上下限。Numpy内置了一个名为Clip的函数,可以用于这种目的。函数的作用是:剪切(限制)数组中的值。给定一个区间,区间外的值被裁剪到区间边缘。例如,如果指定的间隔为[- 1,1],小于-1的值将变为-1,大于1的值将变为1。

带有最小值2和最大值6的剪辑示例

代码语言:javascript
复制
#Example-1
array = np.array([10, 7, 4, 3, 2, 2, 5, 9, 0, 4, 6, 0])
print (np.clip(array,2,6))
[6 6 4 3 2 2 5 6 2 4 6 2]
#Example-2
array = np.array([10, -1, 4, -3, 2, 2, 5, 9, 0, 4, 6, 0])
print (np.clip(array,2,5))
[5 2 4 2 2 2 5 5 2 4 5 2]

4) Extract:根据条件从数组中提取特定的元素

我们可以使用Numpy extract()函数从匹配条件的数组中提取特定的元素。

代码语言:javascript
复制
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# Define the codition, here we take MOD 3 if zero
condition = np.mod(arr, 3)==0
condition
array([ True, False, False, True, False, False, True, False,
False,True])
np.extract(condition, arr)
array([0, 3, 6, 9])

类似地,我们可以将直接条件与和或(如果需要)结合使用

代码语言:javascript
复制
np.extract(((arr > 2) & (arr < 8)), arr)
array([3, 4, 5, 6, 7])

5) setdiff1d:如何找到一个数组中与另一个数组相比的唯一值

返回数组中不在另一个数组中的唯一值。这相当于两个数组的集合差。

代码语言:javascript
复制
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b = np.array([3,4,7,6,7,8,11,12,14])
c = np.setdiff1d(a,b)
c
array([1, 2, 5, 9])

最后注意

这是5个Numpy函数,它们不经常被公众使用,但是它们非常整洁和优雅。在我看来,我们应该在类似的情况下使用它们,因为它们不仅提供了更少的代码,而且提供了实现复杂问题解决方案的最聪明的方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档