Numpy

简介

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

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对象:

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的矩阵作为例子:

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数据的读取和保存:

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的更多相关文章

  1. python数据分析三剑客之: Numpy

    数据分析三剑客之: Numpy 一丶Numpy的使用 ​ numpy 是Python语言的一个扩展程序库,支持大维度的数组和矩阵运算.也支持针对数组运算提供大量的数学函数库 创建ndarray # 1 ...

  2. 数据分析三剑客之一numpy

    NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵. 可以用python实现的科学计算包括: 1.一个强大的N维数组对象Array: 2.比较成熟的(广播)函数库: ...

  3. python数据分析三剑客基础之matpoltlib初解

    一.什么是matplotlib? python的底层绘图工具,主要做数据可视化图表,源自matplot. 二.为什么要学matplotlib? 1.它能将数据进行可视化,更直观的呈现出来 2.它能让数 ...

  4. 数据分析三剑客 numpy,oandas,matplotlib(2)

    Pandas的数据结构 导入pandas:  三剑客 import pandas as pd from pandas import Series,DataFrame import numpy as n ...

  5. 数据分析三剑客 numpy,oandas,matplotlib

    数据分析: 是不把隐藏在看似杂乱无章的数据域背后的信息提炼出来,总结出所研究对象内在规律 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩 ...

  6. Python:机器学习三剑客之 NumPy

    一.numpy简介 Numpy是高性能科学计算和数据分析的基础包,机器学习三剑客之一.Numpy库中最核心的部分是ndarray 对象,它封装了同构数据类型的n维数组.部分功能如下: ndarray, ...

  7. 数据分析与展示——NumPy库入门

    这是我学习北京理工大学嵩天老师的<Python数据分析与展示>课程的笔记.嵩老师的课程重点突出.层次分明,在这里特别感谢嵩老师的精彩讲解. NumPy库入门 数据的维度 维度是一组数据的组 ...

  8. python 数据分析工具之 numpy pandas matplotlib

    作为一个网络技术人员,机器学习是一种很有必要学习的技术,在这个数据爆炸的时代更是如此. python做数据分析,最常用以下几个库 numpy pandas matplotlib 一.Numpy库 为了 ...

  9. 利用Python进行数据分析:【NumPy】

    一.NumPy:数组计算1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.2.NumPy的主要功能: # ndarray,一个多维数组结构,高效且节省空间 # 无 ...

随机推荐

  1. C# ADO.NET的SqlDataReader对象,判断是否包含指定字段

    在使用ado.net的SqlDataReader对象时,如果SqlDataReader实例对象中没有对应的字段,则会在那一行报错.而SqlDataReader类又没有判断是否存在指定字段的方法,怎么办 ...

  2. C#中的CultureInfo类

    CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的接触这个类,当进行数字,日期时间,字符串匹配时,都会 ...

  3. 微信H5页面 会被软键盘顶起来

    问题描述:H5页面在微信中打开,input输入框获取焦点时,页面被软键盘顶上去:关闭软键盘时,页面不会自动下来(恢复初始状态) H5页面在微信中初始状态如下图: input输入框获取焦点时,页面被软键 ...

  4. 微信小程序 canvas 文字居中

    drawCanvas: function(ctx) { //... // 昵称 ctx.setFontSize(16) //字体大小 ctx.setFillStyle('#fff') //字体颜色 c ...

  5. 基于Xamarin Android实现的简单的浏览器

    最近做了一个Android浏览器,当然功能比较简单,主要实现了自己想要的一些功能……现在有好多浏览器为什么还要自己写?当你使用的时候总有那么一些地方不如意,于是就想自己写一个. 开发环境:Xamari ...

  6. MPP-编码示例

    了解MPP的基本功能后,接下来具体分析编码的代码.首先把编码的代码提取出来,方便以后的使用. 完整的编码代码如下,相比较给出的示例代码,做了一些改动,输入的指令全部去除,将函数入口改为利用OpenCV ...

  7. redis -list

    列表的元素类型为string 按照插入顺序排序 增加: 例如: 从列表的 左侧 加入数据 a b c lpush 键 a b c 显示:1“c"2"b"3"c& ...

  8. Mysql事务与锁详解

    脏读: 不可重复读: 幻读: 锁: 表级别的意向锁为了提高效率, 我们能给一张表成功加上一个表锁的前提是:没有任何一个事务对这张表的某些行加了锁. 如果没有意向表锁: 如果现在要给一个表加上表锁. 如 ...

  9. mysql 基础sql语句

    1.mysqladmin语句:  # 查看mysql版本 mysqladmin version  # 更改root用户密码 mysqladmin -u root -p原密码 password '新密码 ...

  10. CTF杂项之音频隐写

    题目来自bugku 二话不说,直接上图 由题目可以看出,这题需要用到一个KEY,加上又是一段音频,很容易联想到一个著名的音频隐写解密软件Mp3stego 直接上工具 ok,成功Get Flag