数据分析三剑客之Numpy

这篇具有很好参考价值的文章主要介绍了数据分析三剑客之Numpy。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据分析三剑客:Numpy,Pandas,Matplotlib

1.简介

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

numpy是基于c语言开发,所以这使得numpy的运行速度很快,高效率运行就是numpy的一大优势。

首先·我们要导入numpy包,一般我们都把它命名为np:

In [1]: import numpy as np 

接着就可以生成一个numpy一维数组: 

In [2]: a = np.array([[1,2,3]],dtype=np.int32)
In [3]: a
Out[3]: array([1, 2, 3]) 

numpy中定义的最重要的数据结构是称为ndarray的n维数组类型,这个结构引用了两个对象,一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象: 

数据分析三剑客之Numpy,数据分析,数据分析,numpy,数据挖掘

2.WHY?

二维数组的生成在python中我们还可以用到list列表,如果用list来表示[1,2,3],由于list中的元素可以是任何对象,所以list中保存的是对象的指针,如果要保存[1,2,3]就需要三个指针和三个整数对象,是比较浪费内存资源cpu计算时间的,而ndarray是一种保存单一数据类型的多维数组结构,在数据处理上比list列表要快上很多,在这里我们可以用%timeit命令来检测两者的数据处理速度:

In [9]: a = range(1000)
In [10]: %timeit[i**2 for i in a]
381 µs ± 6.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [11]: b = np.arange(1000)
In [12]: %timeit b**2
1.41 µs ± 18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

由于相同数据大小的array运算直接作用到元素级上这一numpy特性,结果显而易见,在数据处理上numpy数组比使用for循环的list列表快的不是一点两点。 

3.常用操作

这里生成一个3×3的矩阵作为例子:

In [2]: data = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 等价于data=np.arange(1,10).reshape(3,3)
In [3]: data
Out[3]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]]) 

查看矩阵信息:

In [6]: data.shape    # 返回元组,表示n行n列
Out[6]: (3, 3)

In [7]: data.dtype    # 返回数组数据类型
Out[7]: dtype('int32')

In [8]: data.ndim    # 返回是几维数组
Out[8]: 2 

转换数据类型:

In [11]: a = data.astype(float)    # 拷贝一份新的数组

In [12]: a.dtype
Out[12]: dtype('float64')

数组之间的计算:

In [15]: data+data
Out[15]:
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])

In [16]: data*data
Out[16]:
array([[ 1,  4,  9],
       [16, 25, 36],
       [49, 64, 81]])

可以看出相同规格的数组计算是直接作用在其元素级上的,那不同的规格的数组是否能进行运算呢,我们来看下这个例子:

In [18]: data1 = np.array([[1,2],[1,2]])    #生成一个2x2numpy数组

In [19]: data+data1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-f2592a975589> in <module>()
----> 1 data+data1

ValueError: operands could not be broadcast together with shapes (3,3) (2,2)

我们可以看出不同规格的数组一起计算的话是会报出广播错误的,那是不是可以下结论了,别急我们再来看下方两个特殊例子:

In [20]: data2 = np.array([[1,2,3]])

In [21]: data + data2
Out[21]:
array([[ 2,  4,  6],
       [ 5,  7,  9],
       [ 8, 10, 12]])

In [22]: data3 = np.array([[1],[2],[3]])

In [23]: data+data3
Out[23]:
array([[ 2,  3,  4],
       [ 6,  7,  8],
       [10, 11, 12]])

data2数组的列数量与data数组相等,data3数组的行数量与data数组相等,这两个numpy数组虽然规格与data数组不一样,但却依然可以与data数组进行运算。

数组的切片:

In [24]: data[:2]    # 沿着行(axis=0)进行索引
Out[24]:
array([[1, 2, 3],
       [4, 5, 6]])

In [25]: data[:2,:2]    # 先沿着行(axis=0)进行索引,再沿着列(axis=1)进行索引
Out[25]:
array([[1, 2],
       [4, 5]])

In [26]: data[1,0:2]    # 下标是从0开始
Out[26]: array([4, 5])

这里需要注意的是,切片操作是在原始数组上创建一个视图view,这只是访问数组数据的一种方式。 因此原始数组不会被复制到内存中,传递的是一个类似引用的东西,与上面的astype()方法是两种不同的拷贝方式,这里我们来看一个例子:

In [32]: a = data[1]

In [33]: a
Out[33]: array([4, 5, 6])

In [34]: a[:] = 0

In [35]: data
Out[35]:
array([[1, 2, 3],
       [0, 0, 0],
       [7, 8, 9]])

当切片对象a改变时,data的对应值也会跟着改变,这是在我们日常数据处理中有时会疏忽的一个点,最安全的复制方法是使用

copy() 方法进行浅拷贝:

In [36]: a = data[1].copy()

In [37]: a
Out[37]: array([0, 0, 0])

In [38]: a[:]=9

In [39]: data
Out[39]:
array([[1, 2, 3],
       [0, 0, 0],
       [7, 8, 9]])

数组的布尔索引:

In [43]: data
Out[43]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [44]: data>3
Out[44]:
array([[False, False, False],
       [ True,  True,  True],
       [ True,  True,  True]])

In [45]: data[data>3]    # 找出大于3的元素
Out[45]: array([4, 5, 6, 7, 8, 9])

数组的逻辑表达处理:

In [46]: np.where(data>3,1,0)    # 大于3的标记为1,小于等于3的标记为0
Out[46]:
array([[0, 0, 0],
       [1, 1, 1],
       [1, 1, 1]])

数组的常用统计操作:

In [47]: data.mean(axis=0)    # 沿着行(axis=0)进行索引,求出其平均值
Out[47]: array([4., 5., 6.])
In [49]: data.std()    # 求出全部元素的方差
Out[49]: 2.581988897471611

In [50]: (data>3).sum()    # 统计数组中元素大于3的个数
Out[50]: 6

In [51]: data.any()    # 数组中是否存在一个或多个true
Out[51]: True

In [52]: data.all()    # 数组中是否全部数都是true
Out[52]: True
In [53]: data.cumsum(0)    # 沿着行(axis=0)进行索引,进行累加
Out[53]:
array([[ 1,  2,  3],
       [ 5,  7,  9],
       [12, 15, 18]], dtype=int32)

In [54]: data.cumprod(1)    # 沿着列(axis=1)进行索引,进行累乘
Out[54]:
array([[  1,   2,   6],
       [  4,  20, 120],
       [  7,  56, 504]], dtype=int32)

数组的排序操作:

In [55]: data=np.random.randn(4,4)

In [56]: data
Out[56]:
array([[ 1.58669867,  1.57692769, -1.85828013,  1.17201164],
       [ 1.68160714, -0.83957549, -0.33771694, -0.33782379],
       [-0.03148106, -0.97819034,  0.51126626, -0.08184963],
       [-0.02822319, -0.31934723,  0.70764701,  0.80444954]])

In [57]: data.sort(0)    # 沿着行(axis=0)进行索引,并进行升序排序

In [58]: data
Out[58]:
array([[-0.03148106, -0.97819034, -1.85828013, -0.33782379],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [ 1.68160714,  1.57692769,  0.70764701,  1.17201164]])

In [59]: data[::-1]    # 降序操作
Out[59]:
array([[ 1.68160714,  1.57692769,  0.70764701,  1.17201164],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [-0.03148106, -0.97819034, -1.85828013, -0.33782379]])

注意:直接调用数组的方法的排序将直接改变数组而不会产生新的拷贝。

矩阵运算:

In [62]: x=np.arange(9).reshape(3,3)

In [63]: x
Out[63]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [64]: np.dot(x,x)    # 矩阵相乘
Out[64]:
array([[ 15,  18,  21],
       [ 42,  54,  66],
       [ 69,  90, 111]])

In [65]: x.T    # 矩阵转置
Out[65]:
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

在numpy中的linalg中有还有很多矩阵运算,比如svd分解,qr分解,cholesky分解等等。

numpy数据的读取和保存:文章来源地址https://www.toymoban.com/news/detail-709549.html

In [68]: np.save('name',data)

In [69]: np.load('name.npy')
Out[69]:
array([[-0.03148106, -0.97819034, -1.85828013, -0.33782379],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [ 1.68160714,  1.57692769,  0.70764701,  1.17201164]])

到了这里,关于数据分析三剑客之Numpy的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文本三剑客之 awk

    Linux/UNIX 系统中,awk 是一个功能强大的编辑工具。逐行读取输入文本 以空格作为分割符,多个空格他会自动压缩成一个空格 AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. 1按照命令找指定的行  2.找到的行 打印,操作 awk

    2024年02月08日
    浏览(31)
  • linux文本三剑客详解

    awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。 特点: grep——单纯的查找或匹配文本。 sed——编辑匹配到的文本。 awk——格式化文本,对文本进行较复杂格式处理。 首先了解一下正则表达式: 匹配字符  配置次数  位置锚定:定位出现的位置   实例介绍:

    2024年04月16日
    浏览(24)
  • 网页三剑客之 HTML

    本章开始我们来介绍一下网页前端部分,我们只是简单的介绍一些常用的各种标签,其目的在于为我们后面的项目做准备。 我们并不要求能完全掌握前端的语法,但是在见到以后能够认识这些代码就可以了。 想走后端开发的,前端不需要多么熟悉,毕竟在各个企业中前后端

    2024年02月02日
    浏览(27)
  • 【数据分析之道-NumPy(四)】numpy广播机制

    ✍ 作者简介: i阿极 ,CSDN Python领域新星创作者, 专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中全部文章内容

    2023年04月19日
    浏览(29)
  • 【数据分析之道-Numpy(八)】numpy统计函数

    ✍ 作者简介: i阿极 ,CSDN Python领域新星创作者, 专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中全部文章内容

    2024年02月06日
    浏览(28)
  • 前端三剑客 —— CSS (第三节)

    目录 上节回顾: 1.CSS使用有以下几种样式; 2.选择器         1.基本选择器         2.包含选择器         3.属性选择器 []         4.伪类选择器 :         5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变

    2024年04月08日
    浏览(40)
  • 『 前端三剑客 』:CSS选择器

    上一篇文章我们介绍了 html 的常用标签及用法 , 这次我们来介绍 css 来对页面进行美化处理 css 全称 : 层叠样式表 (Cascading Style Sheets). 主要作用 : 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面 的效果. 能够做到 页面的样式和结构分离 . 一 . 基本语法 基本语

    2024年02月09日
    浏览(32)
  • 『 前端三剑客 』:CSS常用属性

    一 . CSS常用元素属性 1.1 字体家族和 字体大小 设置的字体需要是 windows 上自带的字体 , 要求是系统中已经安装了的字体 使用 css 设置字体为微软雅黑 和 宋体 , 字体大小为 30 px 和 40 px font - size 设置的是字体的字符框的高度的大小 . 设置效果如下所示 1.2 设置字体粗细 font-we

    2024年02月15日
    浏览(33)
  • Linux文本三剑客---awk

    Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。 逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令 可以在免交互的情况下,实现复杂的文本操作。完成自动化配

    2024年02月07日
    浏览(30)
  • 『 前端三剑客 』:HTML常用标签

    在HTML中标签是以成对的结构出现的,在HTML当中代码是通过标签来组织的 , 下面通过见得的Hello World的展现来显示歘HTML 标签的结构 如上述代码块所示,形如 用尖括号进行组织的,成对出现的这个东西就叫做标签 (tag) , 也可以叫做元素(element); 通常情况下一个标签是成对出现的, 开

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包