第一章 数据分析和Numpy基础

1.1数据分析

1.1.1数据

谈到数据我们首先要明白什么是数据,数据是我们通过观察、实验或计算得出的结果。使我们对现象的一种描述,用于表示客观事物的未经加工的原始素材。此处所谈的数据是指结构化的数据,而不是散乱、毫无章法的数据。在进行数据处理的时候我们还需要关心数据的类型,常见的数据类型包括以下几种:

  • 表格型数据,每一列通常包含不同的类型数据。
  • 多维数组。
  • 均匀或者非均匀数组。
  • 由键位相关联的多张数据表格。

在实际应用中,数据通常会进行一种转换,转换成一种更适合分析、建模的模式,也可以提取数据中的特征进行分析。


1.1.2数据存储类型

访问数据时一切的开始,即数据的输出输入是使用其他工具的第一步。数据的输入输出通常由一下几种类型,读取文本文件及硬盘上其他更高效格式的文件、和数据库交换数据、与网络资源进行交互。

.csv.xlsx.txt这三种格式的文件是文本数据常用的存储类型,之后我们会更进一步的讨论这三种格式的文件的读取、处理、和存储。


1.2Numpy基础

1.2.1Numpy简介

NumPy 是一个 Python 包。 即 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。Numeric,即NumPy 的前身,是由Jim Hugunin开发的。他也开发了另一个包Numarray,它拥有一些额外的功能。 2005年,Travis Oliphant通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。

NumPy 通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用。 这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。 但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。在数据分析领域我们主要关心的内容为:

  • 常见的高速、组合算法,例如sort、mean、sum等。
  • 高效的描述性统计和聚合。
  • 对数据进行清理、构造子集、过滤、变换以及快速向量化计算。

尽管Numpy提供了一定的数据操作基础,但还是应该将其视为pandas的基础,而不是一个独立的数据分析库,核心原因是它无法对常见的时间序列类型进行有效的操作。

Numpy的重要性还体现在一下几个方面:

  • Numpy在内部将数据存储在连续的内存块上,这跟Python内建的数据结构是不同的。
  • Numpy的算法库使用C语言写的,所以在操作数据内存时,不必进行数据类型检查等操作,其数组使用的内存量也小于其他内建序列。
  • Numpy可以不写循环就进行全数组复杂计算。

1.2.2ndarray的创建

N维数组对象-ndarray是Numpy核心特征之一,是一个快速、灵活的同类大型数据集容器,该数组允许你使用类似标量的操作在整个数据上进行数据操作。
ndarray 内部由以下内容组成:

  1. 一个指向数据(内存或内存映射文件中的一块数据)的指针。
  2. 数据类型或 dtype,描述在数组中的固定大小值的格子。
  3. 一个表示数组形状(shape)的元组,表示各维度大小的元组。
  4. 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。

方法1array()方法,array方法的介绍如下:

numpy.array(object, dtype = None, copy = True, order = None, subok = >False, ndmin = 0)
参数1:object:指定数组或嵌套的数列
参数2:dtype:指定数组元素的数据类型,可选
参数3:copy:指定对象是否需要复制,可选
参数4:order:指定创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
参数5:subok:指定默认返回一个与基类类型一致的数组
参数6:ndmin:指定生成数组的最小维度

正确示例1:传递一个非嵌套列表对象,生成一个一维数组。

#初始化数据,传递一个非嵌套列表对象,生成一个一维数组。
data = range(10)
arr = np.array(data)
--------------------------------------------------------------------------
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

正确示例2:传递一个嵌套列表对象,生成一个多维数组。

#初始化数据,传递一个嵌套列表对象,生成一个多维数组。
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(data)
--------------------------------------------------------------------------
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

正确示例3:传递一个非嵌套列表对象,同时指定最小维度,同样也可以生成一个多维数组。

#初始化非嵌套数数据,指定ndmin参数,成一个多维数组。
data = range(10)
arr = np.array(data, ndmin=2)
--------------------------------------------------------------------------
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

正确示例4:传递一个非嵌套列表对象,生成一个一维数组。同时传递dtype=complex,指定元素类型为复数

#初始化数据,传递dtype参数,指定元素类型
data = range(10)
arr = np.array(data, dtype=complex)
--------------------------------------------------------------------------
array([0.+0.j, 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j,8.+0.j, 9.+0.j])

正确示例5:传递一个嵌套列表对象,生成一个多维数组。同时传递dtype参数[('a',np.int32),('b', complex)],指定a副本元素类型为整数型,b副本元素类型为复数型。

#初始化数据,传递一个非套列表对象,传递dtype参数,指定a副本元素类型为整数型,b副本元素类型为复数型。
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(data, dtype=([('a',np.int32),('b', complex)]))
--------------------------------------------------------------------------
array([[(1, 1.+0.j), (2, 2.+0.j), (3, 3.+0.j)],[(4, 4.+0.j), (5, 5.+0.j), (6, 6.+0.j)],[(7, 7.+0.j), (8, 8.+0.j), (9, 9.+0.j)]],dtype=[('a', '<i4'), ('b', '<c16')])

使用arr[名称]访问不同的副本。

arr['a']
--------------------------------------------------------------------------
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
arr['b']
--------------------------------------------------------------------------
array([[1.+0.j, 2.+0.j, 3.+0.j],[4.+0.j, 5.+0.j, 6.+0.j],[7.+0.j, 8.+0.j, 9.+0.j]])

错误示例1:传递一个不规则嵌套列表对象。会给出warning,并且创建结果不是多维数组而是一维数组,且是数组元素类型是列表。

#错误示例,传递不规则嵌套列表
data = [[1, 2, 3], [4, 5, 6, 12], [7, 8, 9, 10, 11]]
arr = np.array(data)
--------------------------------------------------------------------------
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
array([list([1, 2, 3]), list([4, 5, 6, 12]), list([7, 8, 9, 10, 11])],dtype=object)

方法2np.zeros()方法,zeros()方法介绍如下。

numpy.zeros(shape, dtype=None, order=‘C’)
作用:生成指定形状的0矩阵
参数1:shape:元组型,指定矩阵形状
参数2:dtype:指定数组所需的数据类型,例如’ numpy.int8 '。默认是“numpy.float64”
参数3:order:指定以何种模式存储多维数据,‘C’:行模式 ‘F’:列模式

正确示例1:传递一个整数,生成一维数组,即zero = np.zeros(m)或者zero = np.zeros((m,))

#传递一个整数,生成一维数组1,np.zeros(m)
zero = np.zeros(5)
--------------------------------------------------------------------------
array([0., 0., 0., 0., 0.])
#传递一个整数,生成一维数组2,zero = np.zeros((m,))
zero = np.zeros((5,))
--------------------------------------------------------------------------
array([0., 0., 0., 0., 0.])

正确示例2:传递一个元祖,生成多维数组,即zero = np.zeros((m, n))

#传递一个整数,生成多维数组
zero = np.zeros((5,5))
--------------------------------------------------------------------------
array([[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.]])

方法3np.empty()方法,empty方法介绍如下。

作用:返回给定形状和类型的新数组,而无需初始化条目。
empty(shape, dtype=None, order=‘C’)
参数1:dtype:元组型或整型,指定空数组形状
参数2:dtype:指定数据类型
参数3:order:指定行优先还是列优先
返回值1:ndarray对象

正确示例1:empty方法和zeros方法使用的方式是一致的,在此不再赘述,只是给出示例。

#empty方法,传递一个元组
np.empty([2, 2])
--------------------------------------------------------------------------
array([[ -9.74499359e+001,   6.69583040e-309],[  2.13182611e-314,   3.06959433e-309]])

ps1:empty方法的初始化值是随机的,不是0,所以比zeros方法速度快,但是要更加注意值的问题。

ps2:使用array方法时传递嵌套列表时,默认情况下每一个子列表作为一行,可以传递order参数进行修改。


1.2.3ndarray的转换

内建类型的数据不光可以转换称为ndarray,也可以进行逆转换。
方法1arr.tolist()转换为列表。

#数据转换,转换为列表
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(data)
list = arr.tolist()
--------------------------------------------------------------------------
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

方法2arr.tobytes()转换为字节对象。

#数据转换,转换为字节对象
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(data)
bytes = arr.tobytes()
--------------------------------------------------------------------------
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00'

ps1:转换方法都是返回一个新的对象,而不是在原视图上进行操作。


1.2.4ndarray的切片和索引

不管是索引还是切片其核心目标都是找出符合要求的数据子集,简单来说就是用正确的方式表示出其子集。

1.2.4.1按行索引

方法1arr[行号,:]

正确示例:传递行号,索引一行。

#初始化数据,按行索引方法1,传递行号,索引单行
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[0, :]
--------------------------------------------------------------------------
array([1, 2, 3])

方法2arr[行号][:]

正确示例:传递行号,索引一行。

#初始化数据,按行索引方法2,传递行号,索引单行
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[0][:]
--------------------------------------------------------------------------
array([1, 2, 3])

ps1:arr[行,列]方法不能直观的展示维度信息,arr[行号][:]更能直观的展示有几个维度。

1.2.4.2按列索引

方法1arr[:, 列号]

正确示例:传递列号,索引一列。

#初始化数据,按列索引方法1,传递列号,索引单列
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[:, 0]
--------------------------------------------------------------------------
array([1, 4, 7])

错误示例:使用arr[:][列号]索引一列,该语句不会索引出第一列,而是这个数组的第一个元素。因为这个语句可以理解为先arr_new=arr[:]复制一个新的数组,再arr_new[0]调用其第一个元素,故不能使用该方法索引列。

#错误示例,索引的是第一个元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[:][0]
--------------------------------------------------------------------------
array([1, 2, 3])

ps1:说行列其实并不准确,更应该称呼axis=0,axis=1,或者维度1、维度2。

1.2.4.3单值索引

方法1arr[行,列]或者arr[行][列]

正确示例:传递两个整数,索引单值。

#按单值索引方法1-1
arr[0, 0]
--------------------------------------------------------------------------
1
#按单值索引方法1-1
arr[0][0]
--------------------------------------------------------------------------
1

1.2.4.4多行/列索引

方法1arr[行1:行2,列1:列2]

正确示例1:传递行1、行2、列1、列2索引多行/列。

#传递行列各两个参数,索引多行、列
arr[0:2, 0:1]
--------------------------------------------------------------------------
array([[1],[4]])

正确示例2:传递行1、列1、列2索引多行/列。

#传递行1、列1、列2索引多行/列
arr[0:, 0:1]
--------------------------------------------------------------------------
array([[1],[4],[7]])

正确示例3:传递行2、列1索引多行/列。

#传递行2、列1索引多行/列
arr[:2, 1:]
--------------------------------------------------------------------------
array([[2, 3],[5, 6]])

错误示例1:使用arr[行1:行2][列1:列2],上面这句话相当于先arr_new=arr[行1:行2, :]result=arr_new[新行1:新行2, :],最后的结果result相当于做了两次多行索引。

arr[0:2][1:]
--------------------------------------------------------------------------
array([[4, 5, 6]])

ps1:多行索引时,不是非得传递4个参数,不传递:后面的参数a:表示从a开始到结尾,不传递:前面的参数:a表示从开头到a-1截止,:则表示整体从开始到结束

1.2.4.5条件索引

方法1arr[condition]

正确示例:传递一个能遍历所有元素的函数作为条件对数组进行筛选。

#使用条件数组进行筛选
arr[arr < arr.mean()] = 0
--------------------------------------------------------------------------
array([[0, 0, 0],[0, 5, 6],[7, 8, 9]])

1.2.4.6布尔索引

布尔索引也可以理解为是条件索引一种,只是一个使用条件,一个使用同形状的布尔数组作为筛子,筛选出所有位置为True的值,示例如下:

#初始化布尔数组
bool_arr = np.random.randn(9).reshape((3, 3))
bool_arr = bool_arr>0
--------------------------------------------------------------------------
array([[False,  True,  True],[False, False, False],[ True,  True, False]])
#使用布尔数组进行筛选
arr[bool_arr] = 0
--------------------------------------------------------------------------
array([[1, 0, 0],[4, 5, 6],[0, 0, 9]])

1.2.4.7神奇索引

在Numpy中神奇索引指的是使用整数数组进行数据索引的方式。

方法1arr[[行1,行2, 行3...][列1, 列2, 列3]]

元素两两对应索引数据,表示列的子列表可以不传,如果只有一个字列表将被认为是行列表。

正确示例:传递两行两列索引2个值。

arr[[2, 0], [2, 1]]
--------------------------------------------------------------------------
array([9, 2])

1.2.5ndarray的赋值

除了创建的时候进行赋值,所有的索引都可以成为赋值的一种方式,即arr[索引]=Values。在此不再赘述索引过程,单纯给出除布尔索引以外的索引赋值相关示例。

#初始化数据
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(data)
--------------------------------------------------------------------------
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

正确示例1:按行赋值。

#按行赋值
arr[0] = [10, 10, 10]
--------------------------------------------------------------------------
array([[10, 10, 10],[ 4,  5,  6],[ 7,  8,  9]])

正确示例2:按列赋值。

#按列赋值
arr[:, 0] = [10, 10, 10]
--------------------------------------------------------------------------
array([[10,  2,  3],[10,  5,  6],[10,  8,  9]])

正确示例3:单值赋值。

#单值赋值
arr[0, 0] = 10
--------------------------------------------------------------------------
array([[10,  2,  3],[ 4,  5,  6],[ 7,  8,  9]])

正确示例4:多行、列赋值。

arr[0:2, :] = [[10, 10, 10], [10, 10, 10]]
--------------------------------------------------------------------------
array([[10, 10, 10],[10, 10, 10],[ 7,  8,  9]])

正确示例4对比示例:赋值的时候要注意形状问题,长度相等并不能直接赋值。

arr[0:2, :] = np.arange(6)
--------------------------------------------------------------------------
ValueError: could not broadcast input array from shape (6) into shape (2,3)

正确示例5:条件赋值。

arr[arr < arr.mean()] = 10
--------------------------------------------------------------------------
array([[10, 10, 10],[10,  5,  6],[ 7,  8,  9]])

正确示例6:神奇索引赋值。

arr[[2, 0], [2, 1]] = [10, 10]
--------------------------------------------------------------------------
array([[ 1, 10,  3],[ 4,  5,  6],[ 7,  8, 10]])

数据分析学习(一)数据分析和Numpy基础相关推荐

  1. Python数据分析学习笔记03:NumPy基础(数组与向量化计算)

    文章目录 一.NumPy的ndarray:多维数组对象 二.创建NumPy的多维数组(ndarray) 1.利用array函数创建NumPy数组

  2. 数据分析学习笔记-数据分析预备知识

    数据分析学习笔记 数据分析预备知识

  3. 数据分析之numpy基础/matplotlib绘图/numpy常用函数/杂项功能

    文章目录 数据分析 numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 ndarray数组对象 ...

  4. python 数据分析5 NumPy 基础:数组和矢量计算

    系列文章:Python 数据分析 文章目录 五.NumPy 基础:数组和矢量计算 1.n维数组对象 ndarray 创建 dtype 数组运算 基本的索引和切片 一维数组 二维数组 布尔型索引 花式索 ...

  5. Python数据分析入门--Numpy基础学习笔记

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 NumPy基础 1.NumPy nadarray:多维数组对象 1.1ndarray及其数据类型 1.2NumPy数组 ...

  6. 《利用Python》进行数据分析:Numpy基础1 数组对象ndarray

    #coding=utf-8__author__ = 'andy' import numpy as np '''数组.numpy数组.ndarray,基本都是一个东西'''#创建数组data1=[6,7 ...

  7. 《利用Python》进行数据分析:Numpy基础9 数组转置和轴对换

    #coding=utf-8__author__ = 'andy'import numpy as np arr=np.arange(15).reshape((3,5)) print(arr)#数组转置, ...

  8. 《利用Python》进行数据分析:Numpy基础2 创建数组

    import numpy as np #创建数组data1=[6,7.5,8,0,1]arr1=np.array(data1)print(arr1) data2=[[1,2,3,4],[5,6,7,8 ...

  9. python 一维数组所有元素是否大于_利用Python进行数据分析(5) NumPy基础: ndarray索引和切片...

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

最新文章

  1. 心系AI的百度,这次能翻身吗?
  2. 数字图像处理:第十章 离散图象变换
  3. 深究AngularJS——过滤器(filter)
  4. 关于QMap的几点总结思考
  5. The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
  6. html中文乱码_Nginx目录浏览的中文显示问题订正
  7. unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi
  8. 鸿蒙os芯片,没有了芯片,华为能靠鸿蒙OS系统打出差异化吗?
  9. 软件测试Bug管理规范
  10. 戴尔T630安装Ubuntu操作系统及Gaussian 09
  11. 网络课大学计算机基础考试,《大学计算机基础》课程期末考试笔试说明
  12. FFplay源码分析-rtmp入口
  13. App Store上的开源应用汇总
  14. 在硅谷初创公司怎么找投资人
  15. 【赖世雄音标】——元音
  16. AurixDevStudio集成MCAL
  17. 0000-0-1-C语言可以做什么C语言可以干啥C++语言可以做什么C++语言可以干啥C语言就业前景C++就业前景
  18. LVGL 8.2.0 Stacked area chart
  19. 1 大奇迹 - 遥感 - 改变世界的技术
  20. 互联网大会2017-防范通讯信息诈骗有感

热门文章

  1. 程序设计思维与实践 CSP-M4
  2. win10可以上网,但是电脑右下角网络连接上有黄色感叹号
  3. 服务器系统重启和断电重启,服务器设置断电重启吗
  4. 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
  5. Python爬虫(一):简单小说爬取实例
  6. 徐州好玩实用的微信小程序
  7. 有符号数和无符号数区别
  8. Vue快速入门(狂神版)
  9. 两种降压升压电路原理图
  10. 把16进制值转换成颜色颜色16进制值表