《python for data analysis》第四章,numpy的基本使用

《利用python进行数据分析》第四章的程序,介绍了numpy的基本使用方法。(第三章为Ipython的基本使用)

科学计算、常用函数、数组处理、线性代数运算、随机模块……

# -*- coding:utf-8 -*-# 《python for data analysis》第四章, numpy基础# 数组与矢量计算import numpy as npimport time

# 开始计时start = time.time()

# 创建一个arraydata = np.array([[1, 2, 3, 4, 5, 6],                 [7, 8, 9, 10, 11, 12]], dtype=np.int32)  # 输入类型为tuple时效果一致, 可指定数据类型,也可缺省print(‘data:‘),print(data)print(‘data.shape:‘),print(data.shape)  # 等价于np.shape(data),(2L,6L),tuple型print(‘data.dtype:‘),print(data.dtype)  # 显示元素的变量类型,int32print(‘type(data):‘),print(type(data))  # 显示整个array的变量类型,numpy.ndarrayprint(‘↑---------------------class1\n\n‘)

# 快速创建一些特殊格式的arrayprint(np.ones(shape=(2, 3)))  # 打印一个2*3,元素全为1的矩阵print(np.zeros(shape=(3, 2)))  # 打印一个3*2,元素全为0的矩阵print(np.empty(shape=(3, 5)))  # 打印一个3*5,元素随机的矩阵print(np.arange(0, 3))  # np.arange同python内置的range,range()产生list对象,np.arange产生array对象。 result: array([0,1,2])print(np.eye(5))  # 创建一个五阶单位矩阵, 等同于np.identity(5)print(‘↑---------------------class2\n\n‘)

# ndarray的数据类型# 用.astype()进行数据类型转换,int转float, 注意float转int时会截尾print(data.dtype)data = data.astype(np.float64)print(data.dtype)# string转floatdata = np.array([‘1.23‘, ‘2.34‘, ‘3.45‘])data = data.astype(np.float64)print(data)print(data.dtype)print(‘↑---------------------class3\n\n‘)

# 数组与数组、数组与标量之间的运算# 1、数组与标量运算,将标量值按照相同的运算规则传播到数组内的各个元素data = np.arange(1, 6)print(‘data:‘),print(data)data = data + 2print(‘data+2:‘),print(data)# 2、数组与数组运算,且两个数组的shape相同,此时任何算术运算均会应用到元素级data1 = np.arange(1, 6)data2 = np.ones(5).astype(np.int32)print(‘\ndata1:‘),print(data1)print(‘data2:‘),print(data2)print(‘data1 * data2:‘),print(data1 * data2)print(‘data1 + data2:‘),print(data1 + data2)# 3、数组与数组运算,且两个数组的shape不相同,此时启用numpy的广播(broadcast)机制# http://baijiahao.baidu.com/s?id=1580719686756248184&wfr=spider&for=pc  广播机制用图说明过程data1 = np.arange(1, 6).reshape(-1, 1)data2 = np.arange(1, 6)print(‘\ndata1:‘),print(data1)print(‘data2:‘),print(data2)print(‘data1 + data2:‘),print(data1 + data2)print(‘↑---------------------class4\n\n‘)

# 基本的索引与切片# 创建一个切片data = np.arange(1, 10)slice_data = data[2:5]  # slice_data是data的一个切片# ★★★★★array的切片是原array的一个视图(引用),切片上任何数据的修改都会直接反映到原array上print(data)  # [1 2 3 4 5 6 7 8 9]print(slice_data)  # [3 4 5]slice_data[1] = 100print(slice_data)  # [  3 100   5]print(data)  # [  1   2   3 100   5   6   7   8   9]# 这和list的切片规则是完全不一样的,list的切片是原list的一个复制origin_list = range(1, 10)slice_list = origin_list[2:5]print(origin_list)  # [1 2 3 4 5 6 7 8 9]print(slice_list)  # [3 4 5]slice_list[1] = 100print(slice_list)  # [  3 100   5]print(origin_list)  # [1 2 3 4 5 6 7 8 9]# array的切片通过.copy()也可以像list那样复制数据而不是引用data = np.arange(1, 10)slice_data = data[2:5].copy()  # slice_data是data的一个切片,复制,而不是引用print(data)  # [1 2 3 4 5 6 7 8 9]print(slice_data)  # [3 4 5]slice_data[1] = 100print(slice_data)  # [  3 100   5]print(data)  # [1 2 3 4 5 6 7 8 9]# 一维数组的索引直接写入标量实现# 二维及以上数组的索引是一个一维数组,行向量与列向量写法等价data_2d = np.empty(shape=(3, 3))print(data_2d[1, 2] == data_2d[1][2])print(‘↑---------------------class5\n\n‘)

# 索引方式,3种# 1、切片索引,切片为原数组的视图,数据引用data = np.arange(1, 6)  # array([1,2,3,4,5])data_slice = data[1:3]  # array([2,3]),print(data_slice)data_nd = np.arange(1, 10).reshape(3, 3)  # 高维数组的切片索引还可以结合整数索引混合使用data_slice = data_nd[1, 1:]  # array([5,6])print(data_slice)data_slice = data_nd[2, :]  # array([7,8,9]) , : 表示选取整条轴print(data_slice)print(‘ ‘)# 2、布尔型索引,切片为数据复制name = np.array([‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘])data = np.arange(1, 19).reshape(6, 3)data_slice = data[name == ‘a‘]print(data)print(data_slice)data_slice[1] = 1  # 布尔型索引产生的子集是数据的复制而不是视图,对子集的改变不影响原数组print(data)print(data_slice)data[data > 10] = 10print(data)data[(data == 2) | (data == 7)] = 1print(data)print(‘‘)# 3、花式索引(fancy indexing),用整数数组进行索引data = np.arange(1, 10).reshape(3, 3)data_slice = data[[1, 2, 0]]print(data)print(data_slice)data_slice[1] = 1  # 花式索引产生的子集也是数据的复制print(data)print(data_slice)data_slice = data[[0, 1]][:, [0, 1]]  # 花式索引还可以选中原数组的某个矩形区域,也可以写为data[np.ix_([0,1],[0,1]])]print(data_slice)print(‘↑---------------------class6\n\n‘)

# 数据转置与轴对换data = np.arange(1, 10).reshape(3, 3)print(data)data_T = data.T  # 转置,也可以写为 data = data.transpose()print(data_T)data_T[1] = 1  # 转置返回的是原数组的视图,无数据的复制print(data_T)print(data)print(‘↑---------------------class7\n\n‘)

# 通用函数,对数组使用,并对其中的数据执行元素级的函数运算# abs\square\sqrt\sign\ceil\floor\rint\mod\exp等等data = np.arange(10)data2 = np.sqrt(data)print(data)print(data2)print(‘↑---------------------class8\n\n‘)

# 条件逻辑的数组运算,用np.where来替代x if condition else ya = np.array([1, 2, 3, 4, 5])b = np.array([6, 7, 8, 9, 0])condition = np.array([True, False, True, True, False])result1 = [(a if condition else b) for a, b, condition in zip(a, b, condition)]print(result1)a = np.array([1, 2, 3, 4, 5])b = np.array([6, 7, 8, 9, 0])condition = np.array([True, False, True, True, False])result2 = np.where(condition, a, b)print(result2)# np.where可用于高维数组而x if condition else y 不行data = np.arange(9).reshape(3, 3)data2 = np.where(data < 5, 5, data)print(data)print(data2)print(‘↑---------------------class9\n\n‘)

# 数组统计,通过某些函数对整个数组或数组上的某个轴进行统计# sum、mean、std、var、min、max、argmin(最小值对应的索引)、argmax、cumsum(所有元素累计和)、cumprod(所有元素累计积)data = np.arange(9).reshape(3, -1)mean = data.mean()  # 对整个数组取平均值print(mean)mean2 = data.mean(1)  # 第二个轴上取平均值,即每一列的平均值print(mean2)cumsum = data.cumsum()print(cumsum)  # 高维会自动转为1维print(‘↑--------------------class10\n\n‘)

# 布尔型数组操作# 布尔型数组的元素为true和false,在运算过程中,true可视为1,false可视为0data = np.array([True, False, True, True])print(data.sum())# .any()用于检查array中元素是否全为0,.all()用于检查array中元素是否全为1# .any()——有一个TRUE则返回1,反之0;.all()——全为TRUE返回1,反之0print(data.any())print(data.all())# .any()、.all()对非布尔型数组进行操作时,所有非零元素视为Truedata = np.array([-1, 1])print(data.all())print(‘↑--------------------class11\n\n‘)

# 数组排序data = np.random.randn(6)print(data)# 两种写法等价# data = np.sort(data) # 用np.sort()函数时不改变原数组,需要赋值操作data.sort()  # .sort()方法自动对元素组进行操作,无需重新赋值print(data)# 高维数组可对某一个轴进行排序data = np.random.randn(3, 3)print(data)data.sort(1)  # 对第二个轴(即每行)进行排序print(data)print(‘↑--------------------class12\n\n‘)

# 集合运算# 数组元素唯一化data = [1, 2, 3, 3, 3]data = np.unique(data)  # np.unique(data) 不对原数据进行去重操作,需要赋值print(data)# intersect1d(x,y) 返回公共元素,即交集,有序; union1d(x,y)返回并集,有序; setxor1d(x,y)返回两个集合的异或集(元素级运算)# setdiff1d(x,y) 类似集合之差,即在x中而不在y中的元素(非对称,注意这一点)data1 = [1, 2, 3]data2 = [1, 3, 5]delta = np.setdiff1d(data1, data2)print(delta)# in1d(x,y) 对元素级对象,返回x中每个元素是否在y中inornot = np.in1d(data1, data2)print(inornot)print(‘↑--------------------class13\n\n‘)

# 数据的保存与读取data = np.arange(1, 10).reshape(3, 3)np.save(‘data.npy‘, data)  # 以二进制格式保存数组data,文件格式.npydata2 = np.load(‘data.npy‘)  # 读取,上一行的逆过程print(data2)data = np.random.randn(3, 3)np.savetxt(‘data.txt‘, data, delimiter=‘,‘)  # 以txt格式保存datadata2 = np.loadtxt(‘data.txt‘, delimiter=‘,‘)  # 读取txt文件到data2这个数组print(data2)print(‘↑--------------------class14\n\n‘)

# 矩阵的线性代数运算# numpy把常用的线性代数运算放在numpy.linalg库中data1 = np.arange(1, 10).reshape(3, 3)data2 = np.eye(3) + np.ones((3, 3))print(data1)print(data2)print(‘‘)multiply = np.dot(data1, data2)print(multiply)print(‘‘)inv = np.linalg.inv(data2)  # 逆矩阵print(inv)print(np.dot(data2, inv))det = np.linalg.det(data1)  # 行列式print(‘‘)print(det)  # 非满秩矩阵lamda, x = np.linalg.eig(data2)  # 求特征值(lamda)与特征向量(x)print(x)print(lamda)x = x.T  # 转置 再取出每一行即为各个特征值对应的特征向量print(np.dot(data2, x[0]))print(lamda[0] * x[0])  # 这一行与上一行结果相同,验证了A·x = lamda·xprint(‘‘)# linalg中还有迹、QR分解、SVD分解、解线性方程、最小二乘等函数print(‘↑--------------------class15\n\n‘)

# 随机模块,np.random# random.seed(),随机种子,使随机特性可复现# 要指出的是,一次seed可以是整个程序的随机性均可复现,但不同地方的随机生成值不同,每次生成随机数前给定seed,则每个随机数相同np.random.seed(0)for i in range(5):    print(np.random.random())  # .random()生成一个随机数print(‘‘)for i in range(5):    np.random.seed(0)    print(np.random.randn())print(np.random.randn(3, 3))  # .randn()按照标准正态分布生成随机值,可指定shapefor i in range(5):    print(np.random.normal(loc=50, scale=10))  # 给定均值和方差的正态分布,loc均值,scale标准差print(np.random.permutation(10))  # 生成给定长度的随机序列# 还有其他分布的随机数生成函数,beta()生成服从beta分布的随机数;chisquare()-卡方分布;# gamma()-gamma分布;uniform()-[0,1)区间内的均匀分布print(‘↑--------------------class16\n\n‘)

# endprint("----------That‘s all----------------- \n total time is %.5f s" % (time.time() - start))

原文地址:https://www.cnblogs.com/asprin/p/9079411.html

时间: 2024-11-06 09:46:48

《python for data analysis》第四章,numpy的基本使用的相关文章

《利用Python进行数据分析&#183;第2版》第四章 Numpy基础:数组和矢量计算

<利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对象.其C语言编写的算法库可以操作内存而不必进行其他工作.比起内置序列,使用的内存更少(即时间更快,空间更少) numpy可以在整个数组上执行复杂的计算,而不需要借助python的for循环 4.0 前提知识 数据:结构化的数据代指所有的通用数据,如表格型,多维数组,关键列,时间序列等 相关包:numpy pa

Python For Data Analysis -- NumPy

NumPy作为python科学计算的基础,为何python适合进行数学计算,除了简单易懂,容易学习 Python可以简单的调用大量的用c和fortran编写的legacy的库   The NumPy ndarray: A Multidimensional Array Object ndarray,可以理解为n维数组,用于抽象矩阵和向量 Creating ndarrays 最简单的就是,从list初始化, 当然还有其他的方式,比如, 汇总,     Data Types for ndarrays

《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

第四章 Numpy基础:数组和矢量计算 实话说,用numpy的主要目的在于应用矢量化运算.Numpy并没有多么高级的数据分析功能,理解Numpy和面向数组的计算能有助于理解后面的pandas.按照课本的说法,作者关心的功能主要集中于: 用于数据整理和清理.子集构造和过滤.转换等快速的矢量化运算 常用的数组解法,如排序.唯一化.集合运算等 高效的描述统计和数据聚合/摘要运算 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支

Python For Data Analysis -- Pandas

首先pandas的作者就是这本书的作者 对于Numpy,我们处理的对象是矩阵 pandas是基于numpy进行封装的,pandas的处理对象是二维表(tabular, spreadsheet-like),和矩阵的区别就是,二维表是有元数据的 用这些元数据作为index更方便,而Numpy只有整形的index,但本质是一样的,所以大部分操作是共通的 大家碰到最多的二维表应用,关系型数据库中的表,有列名和行号,这些就是元数据 当然你可以用抽象的矩阵来对这些二维表做统计,但使用pandas会更方便  

《Python For Data Analysis》学习笔记-1

在引言章节里,介绍了MovieLens 1M数据集的处理示例.书中介绍该数据集来自GroupLens Research(http://www.groupLens.org/node/73),该地址会直接跳转到https://grouplens.org/datasets/movielens/,这里面提供了来自MovieLens网站的各种评估数据集,可以下载相应的压缩包,我们需要的MovieLens 1M数据集也在里面. 下载解压后的文件夹如下: 这三个dat表都会在示例中用到,但是我所阅读的<Pyt

Python For Data Analysis -- IPython

IPython Basics 首先比一般的python shell更方便一些 比如某些数据结构的pretty-printed,比如字典 更方便的,整段代码的copy,执行 并且可以兼容部分system shell , 比如目录浏览,文件操作等   Tab Completion 这个比较方便,可以在下面的case下,提示和补全未输入部分 a. 当前命名空间中的名字 b.对象或模块的属性和函数 c. 文件路径   Introspection, 内省 ?,在标识符前或后加上,显示出对象状况和docst

《python for data analysis》第十章,时间序列

< python for data analysis >一书的第十章例程, 主要介绍时间序列(time series)数据的处理.label:1. datetime object.timestamp object.period object2. pandas的Series和DataFrame object的两种特殊索引:DatetimeIndex 和 PeriodIndex3. 时区的表达与处理4. imestamp object.period object的频率概念,及其频率转换5. 两种频

使用Python进行Data Analysis(1)

Python是一门热门语言,可以应用于多个方向,比如网络变成,云计算,爬虫,自动化运维,自动化运维以及数据科学等. 本文就数据科学方向,介绍如何使用Python进行Data Analysis 1. 工具安装 工欲善其事,必先利其器.可以使用工具Anaconda和Jupyter Notebook以及Python2.7进行开发 1.1 Python 2.7: 下载地址:https://www.python.org/downloads/release/python-2716/,选择对应的操作系统版本进

Python核心编程笔记——第四章

第四章 Python对象 1.类型也是对象: a = 4;type(a)-><type 'int'>,这里"<type 'int'>"是一个类型对象(可以赋值给一个变量),可以使用 type(type(a)) 来验证 2.Python2.2开始,类和类型统一,类=类型,实例是类型的对象 3.任何对象都天生具有布尔值 4.整数对象,字符串对象,元组对象都是不可变对象,Python会高效的缓存整数和字符串对象,所以 a=3;b=1+2;(a is b)会返回T