数据分析 - 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

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

给我点个赞,助我长期写下去。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,660评论 6 96
  • 介绍 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和...
    喔蕾喔蕾喔蕾蕾蕾阅读 1,754评论 0 5
  • 前言 numpy是支持 Python语言的数值计算扩充库,其拥有强大的高维度数组处理与矩阵运算能力。除此之外,nu...
    TensorFlow开发者阅读 3,189评论 0 35
  • numpy.random.randint Return random integers fromlow(inclu...
    onepedalo阅读 1,170评论 0 1
  • 今天是10月5号,是中秋过后的第一天。 都说十五的月亮十六圆,可是我今天也没有见到!今天,我们在山间穿梭,穿过了祁...
    山榛隰苓阅读 352评论 0 0