NumPy基础知识整理(二)

根据利用Python进行数据分析一书整理而成。

三、利用数组进行数据处理

NumPy数组是你可以将许多数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多)。

1. 将条件逻辑表述为数组运算

numpy.where函数是三元表达式 x if condition else y 的矢量化版本。假设我们有一个布尔数组和两个值数组:

xarr = np.arange([1.1,1.2,1.3,1.4,1.5])
yarr = np.arange([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])
# 根据cond中的值选取xarr和yarr的值,为True时选取xarr,否则从yarr中选取
result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)] # 列表推导式
result
# 但是 问题1:速度不快 问题2:无法用于多维数组
# np.where方法如下:
result = np.where(cond, xarr, yarr)
result

# np.where的第二个和第三个参数不必是数组,也可以时标量值
arr = np.random.randn(4,4)
arr
np.where(arr > 0, 2, -2) # 正值替换为2,负值替换为-2
np.where(arr > 0, 2, arr) # 正值替换为2,其他值保持不变

2. 数学和统计方法

可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。sum, mean以及标准差std等聚合计算(或叫约简)既可以当作数组的实例方法调用,也可以当作顶级NumPy函数使用:

arr = np.random.randn(5,4)
arr.mean()
np.mean(arr)
arr.mean(axis=0) % 列,竖着看
arr.mean(axis=1) % 行,横着看
arr.sum()
arr.sum(axis=0)
arr.sum(axis=1)

arr = np.arange(9).reshape((3,3))
arr.cumsum(axis=0)  # 累加
arr.cumprod(axis=1) # 累乘

3. 用于布尔型数组的方法

在上面这些方法中,布尔值会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔型数组的True值计数。

arr = np.random.randn(100)
(arr > 0).sum() # 正值的数量
# 还有两个方法any()和all(),前者测试数组中是否存在一个或多个True,后者检查数组中是否都是True
bools = np.array([False,False,True,False])
bools.any() # True
bools.all() # False

4. 排序

跟Python内置的列表类型一样,NumPy数组也可以通过sort()方法就地排序。

arr = np.random.randn(5)
arr.sort()

arr = np.random.randn(5,3)
arr.sort() # 默认按行排序
arr.sort(axis=1)
arr.sort(axis=0) 

5. 唯一化以及其他的集合逻辑

NumPy提供了一些针对一维ndarray的基本集合运算,最常用的可能要数np.unique()了,它用于找出数组中的唯一值并返回已排序的结果。

numbers = np.array([1,2,3,4,5,4,4,3,3])
np.unique(numbers)

sorted(set(numbers)) # 纯Python代码

# np.in1d()方法用于测试一个数组中的值是否在另外一个数组
np.in1d(numbers, [2,3,6])

NumPy的集合运算如下图:
NumPy集合运算

四、用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。

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

np.save()和np.load()是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。

arr = np.arange(10)
np.save('some_array', arr) # 文件名末尾没有扩展名 .npy,则该扩展名会被自动加上
np.load('some_array.npy')

# 通过np.savez()可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可。
np.savez('array_archive.npz',a=arr, b=arr)
# 读取
arch = np.load('array_archive.npz')
arch['a']
arch['b']

2. 存取文本文件

np.loadtxt()和np.savetxt()方法分别执行读写文本文件操作。

五、线性代数

线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分。

x = np.array([[1,2,3],[4,5,6]])
y = np.array([6,23],[-1,7],[8,9]])
x
y
x.dot(y) # 矩阵乘积 相当于 np.dot(x,y)
np.dot(x, np.ones(3))

# numpy.linalg中有一组标准的矩阵分解运算以及注入求逆和行列式之类的东西
from numpy.linalg import inv,qr
x = np.random.randn(5,5)
mat = x.T.dot(x)
inv(mat)
mat.dot(inv(dot))
q, r = qr(mat) # 计算QR分解
# Python科学计算社区盼望着有朝一日能实现矩阵乘法的中缀运算符,以便能用一种更漂亮的语法代替np.dot。不过目前只能这样了。

常用的numpy.linalg函数如下:
常用的numpy.linalg函数

六、随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。

samples = np.random.normal(size=(4,4))
samples

numpy.random函数

七、范例:随机漫步

占个坑,参见利用Python进行数据分析P123。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值