数据处理遇到麻烦不要慌,5个优雅的Numpy函数助你走出困境

2019 年 12 月 23 日 极市平台

参与:加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~


来源:机器之心@微信公众号
作者:Baijayanta Roy
参与:Luo Sainan、杜伟


【导读】在机器学习和数据科学工程的日常数据处理中,我们会遇到一些特殊的情况,需要用样板代码来解决这些问题。在此期间,根据社区的需求和使用,一些样板代码已经被转换成核心语言或包本身提供的基本功能。本文作者将分享 5 个优雅的 Python Numpy 函数,有助于高效、简洁的数据处理。



在 reshape 函数中使用参数-1


Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望 Numpy 来算出这个未知的维度应该是多少:Numpy 将通过查看数组的长度和剩余维度来确保它满足上述标准。让我们来看以下例子: 


维度为-1 的不同 reshape 操作图示。


  
  
    
a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]]
)
a.shape
(24)

假设我们给定行参数为 1,列参数为-1,那么 Numpy 将计算出 reshape 后的列数为 8。

  
  
    
a.reshape(1,-1)
array([[1, 2, 3, 4, 5, 6, 7, 8]])

假设我们给定行参数为-1,列参数为 1,那么 Numpy 将计算出 reshape 后的行数为 8。

  
  
    
a.reshape(-1,1)
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8]])

下面的代码也是一样的道理。

  
  
    
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]]
)

这也适用于任何更高维度张量的 reshape,但是只有一个维度的参数能赋值为-1。

  
  
    
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]]
])

如果我们尝试 reshape 不兼容的形状或者是给定的未知维度参数多于 1 个,那么将会报错。

  
  
    
a.reshape(-1,-1)
ValueErrorcan only specify one unknown dimensiona.reshape(3,-1)
ValueErrorcannot reshape array of size 8 into shape (3,newaxis)


总而言之,当试图对一个张量进行 reshape 操作时,新的形状必须包含与旧的形状相同数量的元素,这意味着两个形状的维度乘积必须相等。当使用 -1 参数时,与-1 相对应的维数将是原始数组的维数除以新形状中已给出维数的乘积,以便维持相同数量的元素。


Argpartition:在数组中找到最大的 N 个元素



Numpy 的 argpartion 函数可以高效地找到 N 个最大值的索引并返回 N 个值。在给出索引后,我们可以根据需要进行值排序。

  
  
    
array = np.array([1074322590460])index = np.argpartition*(array, -5)[-5:]
index
array([ 6,  110,  7,  0], dtype=int64)np.sort(array[index])
array([ 5,  6,  7,  910])


Clip:如何使数组中的值保持在一定区间内


在很多数据处理和算法中(比如强化学习中的 PPO),我们需要使得所有的值保持在一个上下限区间内。Numpy 内置的 Clip 函数可以解决这个问题。Numpy clip () 函数用于对数组中的值进行限制。给定一个区间范围,区间范围外的值将被截断到区间的边界上。例如,如果指定的区间是 [-1,1],小于-1 的值将变为-1,而大于 1 的值将变为 1。


Clip 示例:限制数组中的最小值为 2,最大值为 6。

  
  
    
#Example-1
array = np.array([1074322590460])
print (np.clip(array,2,6))[6 6 4 3 2 2 5 6 2 4 6 2]#Example-2
array = np.array([10-14-322590460])
print (np.clip(array,2,5))[5 2 4 2 2 2 5 5 2 4 5 2]

Extract:从数组中提取符合条件的元素


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


  
  
    
arr = np.arange(10)
arrarray([0123456789])# Define the codition, here we take MOD 3 if zero
condition = np.mod(arr, 3)==0
conditionarray([ TrueFalseFalse,  TrueFalseFalse,  TrueFalseFalse,True])np.extract(condition, arr)
array([0369])

同样地,如果有需要,我们可以用 AND 和 OR 组合的直接条件,如下所示:

  
  
    
np.extract(((arr > 2) & (arr < 8)), arr)array([3, 4, 5, 6, 7])

setdiff1d:如何找到仅在 A 数组中有而 B 数组没有的元素


返回数组中不在另一个数组中的独有元素。这等价于两个数组元素集合的差集。


  
  
    
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)
carray([1, 2, 5, 9])

小结


以上 5 个 Numpy 函数并不经常被社区使用,但是它们非常简洁和优雅。在我看来,我们应该尽可能在出现类似情况时使用这些函数,不仅因为代码量更少,更因为它们是解决复杂问题的绝妙方法。


原文链接:https://towardsdatascience.com/5-smart-python-numpy-functions-dfd1072d2cb4




-End-





*延伸阅读




CV细分方向交流群


添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入目标检测、目标跟踪、人脸、工业检测、医学影像、三维&SLAM、图像分割、OCR、姿态估计等极市技术交流群(已经添加小助手的好友直接私信),更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流一起来让思想之光照的更远吧~



△长按添加极市小助手


△长按关注极市平台


觉得有用麻烦给个在看啦~  



登录查看更多
0

相关内容

干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
简明扼要!Python教程手册,206页pdf
专知会员服务
48+阅读 · 2020年3月24日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
机器学习速查手册,135页pdf
专知会员服务
342+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
195+阅读 · 2020年3月12日
【新加坡国立大学】深度学习时代数据库:挑战与机会
专知会员服务
35+阅读 · 2020年3月6日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
图解NumPy,这是理解数组最形象的一份教程了
机器之心
6+阅读 · 2019年7月12日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
一文读懂PyTorch张量基础(附代码)
数据派THU
6+阅读 · 2018年6月12日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
【干货】​深度学习中的线性代数
专知
21+阅读 · 2018年3月30日
一文让你入门CNN,附3份深度学习视频资源
机器学习算法与Python学习
12+阅读 · 2018年3月10日
一个小例子带你轻松Keras图像分类入门
云栖社区
4+阅读 · 2018年1月24日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
Compositional Generalization in Image Captioning
Arxiv
3+阅读 · 2019年9月16日
Image Captioning: Transforming Objects into Words
Arxiv
7+阅读 · 2019年6月14日
Pluralistic Image Completion
Arxiv
8+阅读 · 2019年3月11日
Implicit Maximum Likelihood Estimation
Arxiv
7+阅读 · 2018年9月24日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
8+阅读 · 2018年5月1日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
7+阅读 · 2018年1月21日
VIP会员
相关VIP内容
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
简明扼要!Python教程手册,206页pdf
专知会员服务
48+阅读 · 2020年3月24日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
机器学习速查手册,135页pdf
专知会员服务
342+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
195+阅读 · 2020年3月12日
【新加坡国立大学】深度学习时代数据库:挑战与机会
专知会员服务
35+阅读 · 2020年3月6日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
相关资讯
图解NumPy,这是理解数组最形象的一份教程了
机器之心
6+阅读 · 2019年7月12日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
一文读懂PyTorch张量基础(附代码)
数据派THU
6+阅读 · 2018年6月12日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
【干货】​深度学习中的线性代数
专知
21+阅读 · 2018年3月30日
一文让你入门CNN,附3份深度学习视频资源
机器学习算法与Python学习
12+阅读 · 2018年3月10日
一个小例子带你轻松Keras图像分类入门
云栖社区
4+阅读 · 2018年1月24日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
相关论文
Compositional Generalization in Image Captioning
Arxiv
3+阅读 · 2019年9月16日
Image Captioning: Transforming Objects into Words
Arxiv
7+阅读 · 2019年6月14日
Pluralistic Image Completion
Arxiv
8+阅读 · 2019年3月11日
Implicit Maximum Likelihood Estimation
Arxiv
7+阅读 · 2018年9月24日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
8+阅读 · 2018年5月1日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
7+阅读 · 2018年1月21日
Top
微信扫码咨询专知VIP会员