您的位置:首页 > 编程语言 > Python开发

Numpy学习笔记

2017-10-08 17:36 423 查看

安装

通过Anconda安装

网页形式的编辑器

Jupyter NoteBook

很好用

anconda安装好后,直接终端输入

jupyter notebook


然后会跳出网页。目录类似GIT

Numpy介绍+ndarry

scipy

scipy库是基于python生态的一款开源数值计算、科学与工程应用的开源软件。

包括常用的Numpy,pandas、matplotlib等库。

Numpy

Numerical Python

即数值python包

包括的内容

1.一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组,称为ndarray

N-dimensional array object


2.用于对整组数据进行快速运算的标准数学函数

ufunc (universal function object);


3.用于整合c/c++和Fortran代码的工具包

4.实用线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便

约定导入方式

import numpy as np


ndarray

np.array(      ##建立Ndarray多维数组,可以直接使用嵌套列表
【
【1,2,3,4】,          ##开头几个方括号,就是几维的
【2,3,4,5】
】,
【
【3,4,5,6】,
【4,5,6,7】
】
)


ndarray属性

ndim——维度数量

shape——是一个表示各维度大小的元组,即数组的形状

dtype——是一个用于说明数组元素数据类型的对象

arr2 = np.array ( [ 'Python','cctv','ibeifeng',hello world' ] , dtype = '|S4')

arr2
>>>array ( [ 'Pyth','cctv','ibei','hell'],dtype = '|S4')


size——元素总个数,即shape中个数组相乘

ndarry的shape属性巧算

多维数组维度,shape算法

逗号分割

怎么取数

arr2【0】【1】【1】


ndarry的常见创建方式

array函数

接收一个普通python序列,转成ndarray,之前讲的

zeros函数

创建指定长度或形状的全零数组

通过help(zeros)查看帮助

np.zero((2,2))
##使用元组类型,两个括号,定义了两个维度,每个维度有两个值
##2行2列,我觉得倒着看方便
array([[0. , 0.],            ##默认是浮点数
[0. , 0.]])


ones函数

创建指定长度或形状的全1数组,同zeros一样

np.ones((5,6,2) ,dtype = int)


empty函数

创建一个没有任何具体值的数组(准确地说是一些未初始化的垃圾值)

作用:

填充随机值

比如我们要做算法,一开始不知道数值,设一个随机值

NAN 空值,缺失值

其他创建方式

arrange函数

类似与python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值

np.arange(2,20,3)


linspace函数

通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值,等差数列

logspace函数

和linspace类似,不过它创建等比数列

np.logspace(2,20,3)
##第一个值代表10的2次方,第二个代表10的20次方,第三个代表生成元素的个数


以上皆为一维数组,如何生成多维数组(转置)

reshape

np.arange(2,20,2).reshape((3,3))
np.arange(2,20,2).reshape((3,-1))
##-1代表根据前面的数自动计算后面的数


使用随机数填充数组

即用numpy.random模块的random()函数,数组所包含的元素数量由参数决定

np.random.random((2,3,4))
##随机数范围一般在0-1之间
np.random.random_sample()
##生成每一位随机数的方法


总结

先规范显示出数组,

层层去中括号对,直到无中括号对,每去一个层,一个维度,去掉一层[],后的元素个数(逗号隔开)即该维度的元素个数。

Numpy中的数据类型

创建时

创建Numpy数组时可以通过dtype属性显式指定数据类型,如果不指定Numpy会自己判断出合适的数据类型,所以一般无需显式指定。

转换

astype方法,可以转换数组的元素数据类型,得到一个新数组

arr2 = np.arange(2,10,2)
##建立数组
arr2.dtype
##查看类型
arr3 = arr2.astype('float‘)
##转换为浮点格式
arr4 = arr2.astype('|U2')
##使用Unicode编码,每个元素长度为2
arr5 = arr2.astype('|S2')
##使用string编码(转换为十六进制编码),每个元素长度为2
arr6 = np.array([1,2,3,'4'], dtype = np.float)
##建议使用np中自带的形式np.float去处理,规范写法


改变array形状

reshape

形状可变,元素总数不可变

不改变原来的ndarray,得到新的ndarray是原数组的视图

视图的概念

视图

相当于多个变量使用(指向)一个内存地址(空间)

只要修改一个,都会修改

副本

复制一份放到新的内存空间

修改其中一个副本,其他的不会改变

arr3 = arr.copy()
##拷贝,生成副本


因此对于ndarray的一些方法操作,首先区分是否会改变原来变量,以此来判断是视图还是副本

表格详见PPT,引号内填的一般是类型代码

Nnmpy基本操作

数组与标量、数组之间的运算

numpy的算术运算

加法

arr = np.arange(0,20,2)
arr + 2           ##会给每一个元素都加2


或者:

arr2 = np.arange(2,40,4)    ##相加的数组形状要一样
arr + arr2                  ##同一位置的做加法运算


加减乘除基本相同

除法可能警告除数可能为零,结果为0

##怎么处理?
from __future__ import division        ##保证数据合法性
arr2/arr           ##还是会警告,不过异常值原来为0现在为nan


数组算数运算必须保证两边数组形状一致。

元素级的运算。

数据的矩阵积(matrix product)

1.满足第一个矩阵的列数与第二个矩阵的行数相同,才可以进行矩阵乘法——为保证每个元素都有的乘

2.矩阵积不是元素级运算

3.Excel案例

##取随机数
=randbetween(0,10)
##求每个公司花费的总金额和购买的产品大小


索引和切片

索引与切片

两种方法:

new_arr1 [1 ][ 1 ]
new_arr1 [ 1,1 ]


例子:

new_arr1 [1]
new_arr1 [ 1,0:]                        ##普遍写法
new_arr1 [0, 0:2 ,1:3 ]                 ##嵌套取数
##或者
new_arr1 [0] [ 0 : 2 ][ 1 ] [ 1 : 3 ]


切片是视图

布尔型索引

筛选作用

快速筛选数据在不在某个范围内

例子

arr3 > 0.5
##进行判断,输出ture false矩阵
arr3[arr3 >0.5]
##可以把满足条件的值取出来
##true的位置取出来,组成新数组
arr4 [arr4 =='Tom'] = 1
##数据替换,将tom替换为1


与非或操作

数据规整:与&或|非~

花式索引

arr = np.arange (32).reshape((8,4))
arr [[0,3,5]]
arr [[0,3,5],[0,3,2]]
##前一个取出对应行,后一个取出对应列
##整数数组形式索引
ix
##ix函数产生一个索引器


详见PPT

ix
np.ix_([0,3,5],[0,2,3])
np.ix_([0,3,5],[0,2,1,3])
##而且进行了重新排列


数组转置与轴兑换

数组的T属性

arr.transpose()      ##生成视图
arr.T                ##生成视图


轴兑换

通用函数

1.快速的元素级数组函数

2.ufunc

一种对ndarray中的数据执行元素级运算的函数,也可以看做简单函数的矢量化包装器

简单函数:接收一个或多个标量值,并产生一个或多个标量值

3.常见的一元通用函数

##详见PPT
np.isnan(arr3)


4.常见的二元通用函数

np.power(arr,arr2)


5.聚合函数

- 对一组值进行操作,返回一个单一值作为结果的函数

- 因此求数组所有元素之和、最大最小标准差就是聚合函数

- 聚合函数可以指定对数值的某个轴元素进行操作:

arr.mean (axis =0)


np.where函数

np.where函数是三元表达式 x if condition else y 的矢量化版本

实现数据的过滤操作

例子

xarr = np.array( [1.1,2.2,3.3,4.4])
yarr = np.array( [1.2,2.3,3.4,4.5])
bool_arr=np.array([True,False,False,True])   ##布尔数组
zip_arr = zip (xarr,yarr,bool_arr)           ##数组合并
result = ['%.2f' % x if bl else '%.2f' % y  for x,y,bl in zip_arr ]
##三元表达式,满足条件输出,附带格式化功能
np.where (bool_arr,xarr,yarr)
##如果用np.where可以这么做
##np.where(表达式数组,当前表达式为True提取数据的数组,当前表达式为False提取数据的数组)
result = [( x if bl else  y)  for x,y,bl in zip_arr if x >2 ]
##先做for 取出数值,然后做if>2,如果大于2,进行前面三元表达式操作,如果不大于就不操作


np.unique函数

求数组中不重复的元素

例子:

arr = np.array(['中国‘,’中国‘,’中国‘,’美国‘,’英国‘])
arr
for i in arr:
print i
这样才可以显示中文
arr1 = np.unique(arr)
for i in arr:
print i                ##检查发现没有重复值了


数组数据文件读取

分两种

将数组以二进制格式保存到磁盘

save写数据

arr = np.random.random((2,3,4))
np.save('data',arr)
##将多维数组存储到文件,自动添加后缀.npy(二进制文件,记事本无法打开)


load读取二进制形式的数据文件

arr2 = np.load('data.npy')
##读取文件时,需要后缀


存取文本文件

读取数据

np.loadtxt

fname 文件名,dtype 数据类型,comments 注释行的符号定义,delimiter 数据分隔符的定义,converteres 转换函数,skipprows 跳过的行数,usecols 使用哪些列

arr4 = np.loadtxt('example.csv',delimiter = ',' )
##数字自动转为浮点数
##如果原始数据中没有分隔符,用空格,就不用设置分隔符delimiter


np.genfromtxt

np.genfromtxt('example.csv',delimiters = ',')
##类似loatxt


写入文本文件

np.savetxt('arr.csv',arr5,delimiter = ',')
##自动写入了科学计算法

np.savetxt('arr.csv',arr5,delimiter = ','  ,fmt = '%.2f')

np.savetxt('arr.csv',arr5.reshape((2,6)),delimiter = ','  ,fmt = '%.2f')
##修改形状后写入

arr3 = np.random.random((2,3,4))
##如果使用随机数,可能会报错,因为可能不是二维数组
##如果数组为二维以上数组,必须转换为二维数组才能存储

np.savetxt('arr1.csv',arr3.reshape((4,6)),delimiter = ',')
##解决办法,改变形状后,可以存进去
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python numpy