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

《利用python进行数据分析》学习笔记(四)

2017-06-23 10:32 134 查看

Numpy

学习笔记四主要针对本书的第四章进行总结。

ndarry

Numpy最重要的特点就是其N维数组对象,可以利用这种数组对整块数据执行数学运算。

data.shape
data.dtype


每个数组都有一个shape和一个dtype。

[b]创建ndarry[/b]

# 利用array创建
data = [[1,2,3],[8.1,2,4]]
arr = np.array(data)
# 数组维度,这个data就是2维
arr.dim

# 利用zeros和ones创建
# shape为(m,n)的全零数组
np.zeros((m,n))
# shape为(m,n)的全一数组
np.ones((m,n))
# shape为((x,y,z))的未初始化值
np.empty((x,y,z))

# arange
np.arange(15)




[b]ndarry数据类型[/b]

# 利用array创建, 并设置数据类型
arr = np.array([1,2,3],dtype = np.int32)
# 利用astype改变数据类型
float_arr = arr.astype(np.float64)


[b]基本索引和切片[/b]

numpy跟python列表的功能相似,但跟列表最重要的区别在于数组切片是原始数组的视图。这意味着数据不会被赋值,视图上的任何修改都会直接反映到原数组上,不用复制来复制去,就能解决性能和内存的问题。

# arr的第6个元素,下标从0开始
arr[5]
# arr的第6到第8个元素
arr[5:8]
# 得到复制
arr[5:8].copy()
# 二维索引
arr[0][2]
arr[0,2]


[b]布尔索引[/b]

names = np.array(['Bob','Joe','Bob','Will','Joe'])
data = np.random.randn(5,4)

# 输出一个布尔量的数组
names == 'Bob'
# out:array([True,False,True,False,False],dtype=bool)

# 利用这个布尔数组进行索引,得到对应行
data[names == 'Bob']
# 反索引
data[-(names == 'Bob')]
data[names != 'Bob']


[b]花式索引[/b]

# 以特定顺序选取行子集
arr[[4,3,0,6]]

#选取特定位置子集
arr[[1,5,7,2],[0,3,1,2]]
#(最后选出的元素为(1,0)、(5,3)、(7,1)、(2,2))

# 选出一个方形区域
arr[np.ix_([1,5,7,2],[0,3,1,2])]


利用数组进行数据处理

用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯python方式快上一两个数量级(甚至更多)。

# 1000个间隔相等的点
points = np.arange(-5,5,0.01)
xs,ys = np.meshgrid(points,points)
z = np.sqrt(xs**2 + ys**2)


[b]将条件逻辑表述为数组运算[/b]

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

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])

# 利用循环
result  = [(x if c else y)
for x,y,c in zip(xarr,yarr,cond)]
# 利用where
result = np.where(cond,xarr,yarr)


利用循环第一对大数组的处理速度不是很快(因为所有工作都是由纯Python完成的),第二无法用于多维数组,所以用where更好。

[b]集合运算[/b]



线性代数

import numpy.linalg




随机数生成

import numpy.random


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析 numpy