Numpy(Numerical python)是基于Python的高性能的开源数据计算与数据分析基础包,支持大量的数据与矩阵运算,此外也针对数组运算提供大量的数学函数库,Numpy本身没有提供高级的数据分析功能,但理解numpy数组的概念以及面向数组的运算设计有助于高效实用pandas等更加高级的工具。
一、ndarray:一种多维数组对象
Numpy最重要的一个特点就是N维数组对象(即ndarray),该对象是一个快速而灵活的同构数据多维容器,可以利用这种数组对整块数据执行一些数学运算,通常叫做矢量化运算,即大小相等的数组之间的任何算数运算都会将运算应用到元素级,该部分是ndarray相关操作总结
# 举例说明数组的优点 计算A**2 + B**3
a = [0,1,2,3,4]
b = [9,8,7,6,5]
### 一般Python循环方法
def pysum():
c = []
for i in range (len(a)):
c.append(a[i]**2 + b[i]**3)
return c
print (pysum())
### numpy 算法
"""
- 去掉循环,使一维数据更像单个数据,优化算法,提高运算速度
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
"""
import numpy as np
def npsum():
a = np.array([1,2,3,4])
b = np.array([8,7,6,5])
c = a**2 + b**3
return c
print(npsum())
1.1ndarray的生成函数
注意:由于Numpy关注的是数值运算,所以,如果没有特别指定,数据类型基本上是“float64”,因为标准的双精度浮点值(即Python中的float对象)需要占用8个字节,即64位,而且如果没有显式说明,在创建数组时,若有多种数据类型存在,Numpy将会推断出一个较为合适的数据类型。当然Numpy也提供其他的数据类型,以便在操作中自由使用。
x = [1,2,3,4]
a = np.array(x)
print(a)
c = np.array(x,float)
print(c)
d = np.ones((2,3))# 注意此处的括号:一维单括号,多维双括号
print(d)
e = np.ones_like(d)
print(e)
i = np.eye(3,3)
print (i)
h = np.arange(10)
print(h)
1.2.ndarray的数据类型
dtype是一种特殊的对象,它含有ndarray将一块内存解释存为特定数据类型所需要的的信息。提供多种元素类型,优化存储和运算性能。
注意:可以使用astype方法显式转换其dtype,而且会创建一个新的数组,若浮点数转换为小数,小数部分截断。
#将a 的数据类型转换成float64,并生成新的数据
b = a.astype(np.float64)
print(b)
1.3.ndarray的属性查看
#创建数组
a = np.arange(100).reshape(10,10)
print(a)
#查看属性
print(a.dtype,a.shape,a.size,a.ndim)
1.4ndarray的运算与数学函数
数组的运算时整体化矢量运算,每一种算术都应用到元素级。即矢量化运算
x = [2,3,4,5,3,4,5,6,7,9]
a = np.array((x))
print (a)
d = a ** 2
print (d)
c = a.reshape(2,5)
print (c + c)
1.5.基本索引和切片
注意:切片和索引不复制数据
两个概念:
轴(axis):数据的维度
秩(rank):轴的数量
以二维数组为例,有行和列两个轴,一般用axis=0表示行轴,axis=1表示列轴,其秩为2。
一维数组与Python列表的索引和切片相似,区别在于数据不会被复制,切片上的修改会直接反应到源数据上。二维数据的索引各索引及切片位置上的元素不再是标量,而是一维数组。高维数组的切片是按顺序轴依次进行的。
a = np.arange(10)
print(a[5],a[5:8])
#赋值
a[5:8] = 12
print(a)
b = np.arange(100).reshape(10,10)
print(b)
print(b[1],b[2:4])
b[6] = 6
print(b)
1.6.布尔型
布尔型索引对于数据处理十分重要,可以通过布尔索引进行数据筛选与分组
- 选择型 “==”“>”“<”
- 排除型 “!=”“-(布尔索引)”
- 多条件型 布尔索引以“&”“|”连接
- 混合切片 布尔索引与切片相结合,也可以进行赋值。
x = np.arange(10)
y = np.arange(70).reshape(10,7)
print(x,y)
print (x == 3)
print(y[x == 3,4])
print(y[x != 3])
print(y[(x == 3)|(x == 4)])# 注意括号的使用
1.7.转置
- 转置是数组重塑的特殊形式,返回源数组的视图,不会复制数据。
- 函数:A.T
a = np.random.randn(6,3)# 创建随机正态分布数组
print(np.dot(a.T,a))#矩阵内积
二、数据处理:矢量化高级数据处理
numpy数组可以使许多数据处理任务表述为简洁的数组表达式,代替循环的做法,这比纯python实现数值计算快一两个数量级,这对于处理大佬数据极为有利
2.1np.where(condition,x,y)
- 第二,三个参数可以不是数组,而是一个标量值,也可以进行替换。
- np.where(condition,x,y)是x if condition else y 的矢量化表达式,速度快,适用于高维数据,可结合布尔型切片进行操作。
# 创建数组
import numpy as np
x = np.array([1.1,1.2,1.3,1.4,1.5])
y = np.array([2.1,2.2,2.3,2.4,2.5])
c = np.array([True,False,True,True,False])
# 两种方式执行
result1 = [(x if c else y) for x,y,c in zip(x,y,c)]
result2 = np.where(c,x,y)
#打印结果,应该相同
print (result1,result2)
2.2统计学方法
a = np.random.randn(5,4)
print(a,a.mean(),a.sum(1),(a>0).sum())
2.3排序
- a.sort(axis) 不复制,修改数据本身。
2.4线性代数相关
线性代数是任何数组库重要的组成部分,Numpy依据行业标准Fortran(MALTLAB,R同样适用),在numpy.lingla模块中有一组标准的矩阵分解运算以及其他矩阵操作相关的程序。
from numpy.linalg import det,inv,svd,solve,eig
a = np.arange(9).reshape(3,3)
print(a)
print(np.dot(a,a),a.T*a)
c = det(a)
e = svd(a)
g = eig(a)
print(c,e,g)
2.5随机数生成
numpy.random对python中内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。
-------------------------------------结束----------------------------------------------