数据分析之 Numpy 学习(看这篇就够了)

大家知道数据分析中 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

方差是每个数值与平均值之差的平方求和的平均值。标准差是方差的算术平方根,代表一组数据离平均值的分散程度。

更多干货文章,可以关注我公众号

扫描二维码即可关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值