XDRush

Numpy学习笔记

1、数组和矢量计算

利用数组进行统计处理

  • meshgrid

meshgrid()用于从数组a和b产生网格,生成的网格矩阵A和B大小相同,

1
2
3
a = np.arange(-2, 2, 1)
b = np.arange(3, 6, 1)
A, B = numpy.meshgrid(a, b)

生成size(a)*size(b)大小的矩阵,相当于把a从一行重复增加到size(b)行,把b转置成一列再重复增加到size(a)列。

  • where
    np.where函数是三元表达式x if conditoin else y的矢量化版本。
    1
    2
    3
    4
    5
    xaar = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
    yaar = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
    # cond为true时,选取xaar中的元素,否则选取yaar中的元素
    cond = np.array([True, False, True, False, True])
    result = np.where(cond, xaar, yaar)

where的第二个和第三个参数不必是数组,也可以是标量值。在数据分析中,where通常用语根据一个数组产生另外一个新的数组。

假设有一个随机数据组成的矩阵,将其中的正数替换为2,负数替换为-2,

1
2
3
4
5
6
7
8
aar = np.random.randn(4, 4)
# 正数替换为2,负数替换为-2
result = np.where(aar > 0, 2, -2)
# 只将正数替换为2
result = np.where(aar > 0, 2, aar)
print result

数学和统计方法

可以通过数组上的一组函数对整个数组或者某个轴向的数据进行统计计算。sum、mean、以及标准差等聚合计算既可以当作数组的实例方法调用,也可以当作numpy的顶级函数使用。

1
2
3
4
5
6
7
8
9
10
arr = np.random.randn(5, 4)
print arr.mean() # equals np.mean(arr)
print arr.sum()
print arr.mean(axis=0) # equals arr.mean(0)
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
# 按行计算所有元素的累计和
result = arr.cumsum(1)
# 按列计算所有元素的累计积
result = aar.cumprod(0)

其他函数有:

1
2
3
std、var:标准差和方差
min、max:最大值和最小值
argmin、argmax:最小和最大元素的索引

用于布尔型数组的方法

sum()经常用来对布尔型数组中的True值计数:

1
2
3
arr = np.random.randn(10)
# arr中正数的数量
result = (arr > 0).sum()

另外,any()用语测试数组中是否存在一个或者多个True,all则检测数组中所有值是否都是True。

1
2
3
bools = np.array([False, True, False, True])
result1 = bools.any() # True
result2 = bools.all() # False

排序

跟python内置的列表类型一样,numpy数组也可以通过sort方法进行就地排序:

1
2
3
4
5
6
7
8
9
10
arr = np.random.randn(8)
print arr
arr.sort()
print arr
arr = np.random.randn(5, 3)
print arr
# 多维数组列排序
arr.sort(0)
print arr

np.sort()返回的是数组得已排序副本,而就地排序则会修改数组本身。

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

np.unique,用于找出数组中的唯一值并返回已排序的结果。

1
2
3
4
arr = np.array([1, 2, 4, 2, 10, 9, 5, 3])
# 相当于返回所有出现过的元素,并返回只出现一次的结果
result = np.unique(arr)
print result # 1, 2, 3, 4, 5, 9, 10

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

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

将数组以二进制格式保存

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

1
2
3
4
5
6
7
arr = np.arange(10)
print arr
# 如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上
np.save('some_array', arr)
result = np.load('some_array.npy')
print result

np.savez()用于将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可:

1
2
3
4
arr1 = np.arange(5)
np.savez('arrays', a=arr, b=arr1)
arch = np.load('arrays.npz')
print arch['b']

线性代数

  • 矩阵乘法
    1
    2
    3
    x = np.array([[1, 2, 4], [4, 5, 6]])
    y = np.array([[1, 2], [3, 4], [5, 6]])
    print x.dot(y) # equals np.dot(x, y)

numpy.linalg中有一组标准得矩阵分解运算以及诸如求逆和行列式之类得方法。

1
2
3
4
5
6
7
8
9
10
x = np.random.randn(5, 5)
mat = x.T.dot(x)
# 计算逆矩阵
print np.linalg.inv(mat)
print mat.dot(np.linalg.inv(mat))
# 计算QR分解
q, r = np.linalg.qr(mat)
print q

一些其他常用的函数说明:
(1)trace:计算对角线元素的和
(2)det:计算行列式
(3)svd:计算奇异值分解
(4)solve:解线性方程主Ax=b

4、随机数生成

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

  • normal
    得到服从标准正态分布得随机数。

    1
    2
    samples = np.random.normal(size=(4, 5))
    print samples
  • shuffle
    对一个序列就地随机排列

  • binomial
    产生二项分布得样本值