大家知道数据分析中 Python 用到的最多的第三方库便是 Numpy 了,它有着无可比拟的优势,它提供的数据结构比 Python 的更高级、更高效,可以说 Numpy 是 python 数据分析的基础。
在标准的 Python 中,有个列表 list,我们知道 list 相当于一个数组的结构,但是由于列表中 list 保存的是对象的指针。在 python 编程中省去了指针的概念,但是数组有指针。如果在 Python 中我保存一个数组 [0, 1, 2, 3],我需要 4 个指针和 4 个整数对象,这样会浪费 python 的内存和计算时间。
Python 列表结构中的元素在系统中是分散存储的,而 Numpy 数组存储在一个均匀连续的内存块中。这样数组元素遍历所有的元素,不需要像 list 一样对内存地址进行查找,大大地节省了计算单元。
Numpy 这么厉害,我们赶紧来学习吧!Numpy 中有两个对象:1. ndarray (N-dimensional array object) 解决了多维数组问题,而 ufunc ( universal function object) 可以对数组进行处理。我们先从 ndarray 开始。
ndarray
创建数组
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
b[1,2] = 90
print(a)
print(b)
print(a.shape)
print(b.shape)
print(a.dtype)
print(b.dtype)
运行结果
[1 2 3 4]
[[ 1 2 3 4]
[ 5 6 90 8]
[ 9 10 11 12]]
(4,)
(3, 4)
int32
int32
我们先导入 numpy 库,记为 np。我们创建了一个 a 数组,然后创建了一个多重数组 b,b 数组中可以认为一个数组作为一个元素,然后嵌套,例如 [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], 三个元素嵌套在 []
里面,赋值给变量 b。
通过函数 shape 属性获得数组的大小,通过 dtype 获得元素属性。修改数组中的元素直接赋值即可。
结构数组
import numpy as np
persontype = np.dtype({
'names':['name', 'age', 'chinese', 'math', 'english'],
'formats':['S32', 'int', 'int', 'int', 'float']
})
peoples = np.array([('zhangsan', 20, 79, 88, 89), ('lisi', 21, 90, 97, 98.5),
('wangwu', 18, 99, 18, 90.5),],
dtype=persontype)
ages = peoples[:]['age']
chinese = peoples[:]['chinese']
math = peoples[:]['math']
english = peoples[:]['english']
print(np.mean(ages))
print(np.mean(chinese))
print(np.mean(math))
print(np.mean(english))
输出结果
19.666666666666668
89.33333333333333
67.66666666666667
92.66666666666667
结构数组中我们先定义了数组的类型:persontype, 然后创建数组时直接指定了 dtype = persontype, 然后我们可以自由使用 persontype 了,想知道每个人的年龄,可以用 ages = peoples[:]['age'],最后我们用 np.mean() 求平均值。
unfnc 运算
numpy 中 ufnc 函数运算非常快,因为都是用 C 语言实现的。
连续数组创建
x1 = np.arange(1, 15, 2)
x2 = np.linspace(1, 13, 7)
print(x1)
print(x2)
[ 1 3 5 7 9 11 13]
[ 1. 3. 5. 7. 9. 11. 13.]
可以看到那种方式的结果一样,但是创建方式有所不同。
arange(), 通过指定初始值、终值、步长、来创建等差数组的一维数组,默认不包含终值。
linspace 是 linear space 的缩写,linespace()通过指定初始值、终值、元素个数来创建等差数组的一维数组,包含终值。
数学运算
x1 = np.arange(1, 15, 2)
x2 = np.linspace(1, 13, 7)
print(np.add(x1, x2)) # 加
print(np.subtract(x1, x2)) # 减
print(np.multiply(x1, x2)) # 乘
print(np.divide(x1, x2)) # 除
print(np.power(x1, x2)) # 求 n 次方
print(np.remainder(x1, x2)) # 取余
统计函数
想要对数据有更加清晰的认识,必须要用到统计函数,如最大值、最小值、中位数、平均数、标准差等,下面我来为你一一讲解。
最大值函数 amax()、最小值函数 amin()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(a)
print(np.amin(a))
print(np.amin(a, 0))
print(np.amin(a, 1))
print(np.amax(a))
print(np.amax(a, 0))
print(np.amax(a, 1))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
1
[1 2 3 4]
[1 5 9]
12
[ 9 10 11 12]
[ 4 8 12]
对于一个二维数组,np.amin(a) 是输出数组中最小的数,np.amin(a, 0) 是延着 axis = 0 轴的最小值,np.amin(a, 1) 是延着 axis = 1 的轴的最小值。axis = 0 表示跨行,axis = 1 表示跨列,即把元素看成 [1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]。
最大值与最小值之差 ptp()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(np.ptp(a))
print(np.ptp(a, 0))
print(np.ptp(a, 1))
11
[8 8 8 8]
[3 3 3]
统计数组的百分位数 percentile()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(a)
print(np.percentile(a, 50))
print(np.percentile(a, 50, axis=0))
print(np.percentile(a, 50, axis=1))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
percentile() 代表第 p 个百分位数,p = 0, 代表求最小值,p = 50 代表求平均值, p = 100 代表求最大值。
统计数组里的中位数 median()、平均数 mean()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(np.median(a))
print(np.median(a, 0))
print(np.median(a, 1))
print(np.mean(a))
print(np.mean(a, 0))
print(np.mean(a, 1))
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
统计数组中的加权平均值 average()
b = np.array([1, 2, 3, 4])
weigh = np.array([1, 2, 3, 4])
print(np.average(b))
print(np.average(b, weights=weigh))
2.5
3.0
你可以指定权重数组如 weigh = [1, 2, 3, 4], 结果为 (11+22+33+44)/ (1+2+3+4)= 3.0
标准差 std()、方差 var()
b = np.array([1, 2, 3, 4])
print(b.std())
print(b.var())
1.118033988749895
1.25
方差是每个数值与平均值之差的平方求和的平均值。标准差是方差的算术平方根,代表一组数据离平均值的分散程度。