numpy类库是数据分析的利器,用于高性能的科学计算和数据分析。使用python进行数据分析,numpy这个类库是必须掌握的。numpy并没有提供强大的数据分析功能,而是它提供的ndarray数据结构能够让你快速的处理海量的数据。

shape和dtype属性

ndarray是numpy的多维数组对象,是numpy类库中主要的数据结构,它有两个重要的属性,shape和dtype,shape是描述数组维度的元组,dtype用于说明数组数据类型。

  1. data = [1,2,3,4,5]
  2. arr1 = np.array(data)
  3. arr1
  4. Out[6]: array([1, 2, 3, 4, 5])
  5. arr1.shape
  6. Out[7]: (5,)
  7. arr1.dtype
  8. Out[8]: dtype('int32')

上面代码说明可arr1是长度为5的一维数组,数据类型是int32。

ndarray数组的数据都是整数时,数据类型是int32,当有小数时,数据类型则是float64。

ndarray数组中的数据必须是同一类型,如果有不同类型的数据,dtype为<U11

numpy主要用于处理数据,因此ndarray数组中的数据必须是同一数据类型,否则无法进行数学计算。

创建ndarray

numpy提供了array函数创建ndarray对象,array函数要传入一个list列表类型的对象。

  1. list1 = [1.2,2.3,4.6,7.8]
  2. ndarray1 = np.array(list1)
  3. ndarray1
  4. Out[22]: array([1.2, 2.3, 4.6, 7.8])

传入的list列表是等长的多维列表时,创建的是多维的ndarray数组对象。

  1. list2 = [[1.2,2.3,4.6,7.8],[12.2,13.5,1.6,9.8]]
  2. ndarray2 = np.array(list2)
  3. ndarray2
  4. Out[25]:
  5. array([[ 1.2, 2.3, 4.6, 7.8],
  6. [12.2, 13.5, 1.6, 9.8]])

多维列表的长度不一致时,生成ndarray对象的数据类型dtype就变成object,不是具体的数据类型。

  1. list3 = [[1.2,2.3,4.6,7.8],[12.2,13.5,1.6,9.8,0.8]]
  2. ndarray3 = np.array(list3)
  3. ndarray3
  4. Out[28]:
  5. array([list([1.2, 2.3, 4.6, 7.8]), list([12.2, 13.5, 1.6, 9.8, 0.8])],
  6. dtype=object)

numpy还提供了zeros和ones两个方法分别用于创建值为0或者1的数组。

使用zero方法创建数组值为0的ndarray数组:

  1. np.zeros(5)//创建长度为5,数组值都为0的ndarray一维数组
  2. np.zeros((3,4))//创建3行4列,数组值都为0的二维数组
  3. np.zeros((3,4,5))//创建维度为3,值为0的ndarray三维数组。

只用ones方法创建数组值都为1的ndarray数组:

  1. np.ones(5)//创建长度为5,数组值都为1的ndarray一维数组
  2. np.ones((3,4))//创建3行4列,数组值都为1的二维数组
  3. np.ones((3,4,5))//创建维度为3,值为1的ndarray三维数组。

arange()方法直接调用python内置的range()函数生成初始值为0步长为1的数组:

  1. data3 = np.arange(13)
  2. data3
  3. Out[12]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

empty()方法创建一个新的数组,数组值是随机生成,用于占用内存空间:

  1. data4 = np.empty((2,2))
  2. data4
  3. Out[20]:
  4. array([[7.32086553e-315, 1.01777082e-311],
  5. [0.00000000e+000, 7.31249282e-315]])

类型转换

ndarray提供astype方法将数据类型转换为其他的数据类型。

将浮点数转为整数时,会自动截取掉小数部分:

  1. data5 = np.array([2.2,3.4,5.6])
  2. data6 = data5.astype(np.int32)
  3. data6
  4. Out[23]: array([2, 3, 5])

astype可以将全是数字的字符串数组转换为数值形式:

  1. data7 = np.array(['2.4','3.5','4.6'])
  2. data8 = data7.astype(np.float64)
  3. data8
  4. Out[34]: array([2.4, 3.5, 4.6])

数组间的数学运算

两个数组之间是可以进行加减乘除间的数学运算。

两个数组之间的相加:

  1. data1 = np.array([1,2,3,4])
  2. data2 = np.array([5,6,7,8])
  3. data3 = data1 +data2
  4. data3
  5. Out[38]: array([ 6, 8, 10, 12])

两个数组之间相减:

  1. data1 = np.array([1,2,3,4])
  2. data2 = np.array([5,6,7,8])
  3. data3 = data1 - data2
  4. data3
  5. Out[45]: array([-4, -4, -4, -4])

两个数组之间相乘:

  1. data1 = np.array([1,2,3,4])
  2. data2 = np.array([5,6,7,8])
  3. data3 = data1 * data2
  4. data3
  5. Out[49]: array([ 5, 12, 21, 32])

两个数组之间相除:

  1. data1 = np.array([1,2,3,4])
  2. data2 = np.array([5,6,7,8])
  3. data3 = data1 / data2
  4. data3
  5. Out[53]: array([0.2 , 0.33333333, 0.42857143, 0.5 ])

两个数组之间进行数学运算时,数组之间的shape对象值必须一致,就是长度必须一致。否则会报ValueError: operands could not be broadcast together with shapes 的错误:

  1. data1 = np.array([1,2,3,4])
  2. data2 = np.array([5,6,7,8,9])
  3. data3 = data1+ data2

上面的代码会报ValueError: operands could not be broadcast together with shapes (4,) (5,) 错误,data1数组的shape为(4,),data2的shape为(5,),两者不一样,无法进行数学运算。

数组的索引和切片

通过索引可以访问NumPy数组某个位置上的数值。数组索引从0开始,于长度-1结束:

  1. data1 = np.arange(10)
  2. data1.size
  3. Out[73]: 10
  4. data1[0]
  5. Out[74]: 0
  6. data1[9]
  7. Out[75]: 9
  8. data1[10]

在上面的代码中,长度为10的一维度数组data1,索引从0开始,于9(长度10-1)结束。通过data1[9]访问到数组中的第10个元素,如果通过data1[10],则会出现IndexError: index 10 is out of bounds for axis 0 with size 10的错误,俗称数组越界。

这是一维数组的情况,对于多维数组,要想访问某个具体元素时,必须指定这个元素在每一个维度的索引位置:

  1. data1 = [[[1,2,3],[4,5,6]],[[7,8,9,],[10,11,12]]]
  2. data1[1][1][1]
  3. Out[85]: 11

上述代码中data1是一个2X2X3的三维数组,要想访问11,必须指定三个维度上的索引data1[1][1][1]。

data1[1][1]返回的结果是1维的数组:

  1. data1[1][1]
  2. Out[86]: [10, 11, 12]

data1[1]返回的是2维的数组:

  1. data1[1]
  2. Out[87]: [[7, 8, 9], [10, 11, 12]]

data1[1][1][1]和data1[1,1,1]的效果一样,返回的数值都是11。

NumPy提供在ndarray数组上进行切片的操作,返回的是ndarray数组的子视图。

  1. data1 = np.arange(10)
  2. data1[1:4]
  3. Out[91]: array([1, 2, 3])
  4. data1[:4]
  5. Out[92]: array([0, 1, 2, 3])
  6. data1[4:]
  7. Out[93]: array([4, 5, 6, 7, 8, 9])

data1[1:4]切片操作返回的是从索引1开始,到索引4结束,不包括索引4的元素的数组。

data1[:4]切片操作是从索引0开始,到索引4结束,不包括索引4的元素的数组。

data1[4:]切片操作返回的是从索引4开始到最后一个元素的数组。

切片操作返回的是原数组的视图,不是重新生成一个数组,通过对这个切片做赋值操作,就可以修改原数组对应索引位置上元素的数值:

  1. data1 = np.arange(10)
  2. data1[4:]=10
  3. data1
  4. Out[98]: array([ 0, 1, 2, 3, 10, 10, 10, 10, 10, 10])

data1数组从索引4开始到最后一个索引9上的元素数值都变为10。

二维及以上的多维数组,也可以支持切片操作,但是比一维数组要复杂些:

  1. data1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
  2. data1
  3. Out[100]:
  4. array([[1, 2, 3],
  5. [4, 5, 6],
  6. [7, 8, 9]])
  7. data1[:2]
  8. Out[101]:
  9. array([[1, 2, 3],
  10. [4, 5, 6]])
  11. data1[:2,:2]
  12. Out[102]:
  13. array([[1, 2],
  14. [4, 5]])
  15. data1[:2,1:]

多维数组的切片,可在每个维度都进行切片操作。

布尔型数组

顾名思义,布尔型数组就是指数组的元素时布尔值True和False。

变量的比较运算产生的结果是布尔型的,ndarray数组的比较运算也不例外,结果也是布尔类型的,因此可以将一个数字类型或者字符类型的ndarray数字通过比较运算转换为布尔型数组:

  1. data1 = np.array(['Tom','Yong','Jim','John'])
  2. data1 == 'Tom'
  3. Out[111]: array([ True, False, False, False])

上面的代码首先创建一个字符类型的ndarray数组data1,接着对数组进行比较操作,data1 == 'Tom',如果数组中的元素等于'Tom',则返回True,否则返回False。

布尔型数值一个最经常的用法是设置值:

  1. arr = np.random.randn(3,4)
  2. arr
  3. Out[62]:
  4. array([[ 0.52428143, -1.04842533, -1.00102911, -0.86488208],
  5. [ 3.20965669, 0.4379931 , -0.82962251, 0.63862152],
  6. [-1.03235591, -1.17507334, -0.01953273, -1.13759955]])
  7. arr[arr<0] = 0
  8. arr
  9. Out[64]:
  10. array([[0.52428143, 0. , 0. , 0. ],
  11. [3.20965669, 0.4379931 , 0. , 0.63862152],
  12. [0. , 0. , 0. , 0. ]])

上面的代码是将arr数组中小于零的元素设置为0。

数组转置

数组转置和线性代数中矩阵转置一样。NumPy提供transpose方法和特殊属性T实现数组转置。

  1. data1 = np.arange(4)
  2. data1
  3. Out[71]: array([0, 1, 2, 3])
  4. data1.T
  5. Out[72]: array([0, 1, 2, 3])

一维数组的转置还是数组本身。

  1. data1 = np.arange(14).reshape(2,7)
  2. data1
  3. Out[74]:
  4. array([[ 0, 1, 2, 3, 4, 5, 6],
  5. [ 7, 8, 9, 10, 11, 12, 13]])
  6. data1.T
  7. Out[75]:
  8. array([[ 0, 7],
  9. [ 1, 8],
  10. [ 2, 9],
  11. [ 3, 10],
  12. [ 4, 11],
  13. [ 5, 12],
  14. [ 6, 13]])

二维数组的转置是将行和列对应位置的元素互相调换。

特殊属性T只适用于一维和二维数组,对于三维以上的数组,必须使用transpose方法才可以实现数组转置。

调用transpose方法时需要传入一个元组,用于指定按照哪些轴进行转置。元组的元素个数和数组的维度要保持一致。如果适合3维数组,那么元组个数也必须是3。

  1. data1 = np.arange(24).reshape(2,3,4)
  2. data1
  3. Out[107]:
  4. array([[[ 0, 1, 2, 3],
  5. [ 4, 5, 6, 7],
  6. [ 8, 9, 10, 11]],
  7. [[12, 13, 14, 15],
  8. [16, 17, 18, 19],
  9. [20, 21, 22, 23]]])
  10. data1.transpose((2,1,0))
  11. Out[108]:
  12. array([[[ 0, 12],
  13. [ 4, 16],
  14. [ 8, 20]],
  15. [[ 1, 13],
  16. [ 5, 17],
  17. [ 9, 21]],
  18. [[ 2, 14],
  19. [ 6, 18],
  20. [10, 22]],
  21. [[ 3, 15],
  22. [ 7, 19],
  23. [11, 23]]])

上面代码先是创建一个2x3x4的三维数组,然后调用transpose((2,1,0))方法实现数组转置。data1数组的轴用数字0,1,2表示(类似三维空间中的x,y,z轴)。调用transpose((2,1,0))时,元组(2,1,0)表示将data1的第0轴和第2轴置换,1轴不变。

数组置换返回的是源数据的视图,不会重新生成新的数组。

数据分析入门——numpy类库基础知识的更多相关文章

  1. 数据分析入门——Pandas类库基础知识

    使用python进行数据分析时,经常会用Pandas类库处理数据,将数据转换成我们需要的格式.Pandas中的有两个数据结构和处理数据相关,分别是Series和DataFrame. Series Se ...

  2. Struts2入门1 Struts2基础知识

    Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...

  3. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  4. Python 入门之Python基础知识

    Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...

  5. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...

  6. 数据分析入门——numpy

    一.什么是numpy Numpy提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于处理多维数组(矩阵)的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是 ...

  7. JAVAWeb入门之JSP基础知识

    也是到了考试周,很多课都结了,准备去学点新东西.随后就开始自学JAVAWeb. 要学习JAVAWeb,首先需下面的知识: a)      HTML/CSS/JS(前端页面),XML,JSON,vue ...

  8. Kinect for Windows SDK开发入门(二):基础知识 上

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/03/31/KinectSDK_Application_Fundamentals_Part1.htm ...

  9. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

随机推荐

  1. JS学习笔记Day21

    一.mySQL数据库 (一)数据库的概念 1.概念:可以存储数据的一个仓库 2.结构化数据:以表格的形式展现,结构更清晰,这样的数据称之为结构化数据 (二)数据库管理软件 1.一种对数据库文件进行管理 ...

  2. react项目后台及上线步骤

    应同学要求,本人将react项目创建后台及上线流程书写如下: 前端部分 略…… 后台部分 (注:这里的后台是用的nodejs搭建的,使用的是express框架+ejs模板) 首先通过express快速 ...

  3. [JDK8] Stream

    1 collect(toList()) collect(toList()) 方法由Stream 里的值生成一个列表,是一个及早求值操作. 2 map 如果有一个函数可以将一种类型的值转换成另外一种类型 ...

  4. H5_0004:JS设置循环debugger的方法

    在HTML页面加上如下代码,则PC打开控制台后,就会循环debugger,防止调试代码. <script>eval(function (p, a, c, k, e, r) { e = fu ...

  5. Python学习第二节——基础知识

    # !/usr/bin/edv python    脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.# -*- coding:UTF-8 -*-    标明编码注释 ...

  6. 移动开发常用head部分

    <!--[viewport] 设置布局viewport的各种信息: width=device-width:布局viewport宽度等于设备宽度 initial-scale=1.0:默认缩放比为1 ...

  7. DOS:第一天

    cd,有时也写作chdir(change directory,改变目录),是在Unix.Windows和DOS操作系统下用于改变工作目录的命令行命令.在Unix的外壳脚本与Windows或DOS的批处 ...

  8. css sprites 图标合并工具网站

    https://www.toptal.com/developers/css/sprite-generator

  9. Linux-ubuntu16.04安装 mysql5.7-PHP7.0+Swoole

    步骤1 – 安装MySQL 在 Ubuntu 16.04 中,默认情况下,只有最新版本的 MySQL 包含在 APT 软件包存储库中.只需更新服务器上的包索引并安装默认包 apt-get. sudo ...

  10. zimbra6同域名与同hostname与同系统异机恢复

    系统:redhat5.4_64 安装DNS:[root@test6 ~]# yum install bind -y[root@test6 ~]# yum install bind-chroot -y[ ...