Python与算法社区
已原创 452 篇,干货满满
三步加星标
01
02
03
三步加星标
你好,我是 zhenguo
2020年年终,是时候把我写过的最好的作品呈现给你了,在接下来这几天我会陆续发送出来。
最近两天已经推送:
1. 一本20+页的精品PDF,全部个人原创,21 个Pandas 使用小技巧:
我原创的 Pandas 数据分析 21 个使用小技巧
2. 过去原创的 10 个 Python 可视化图,源码全部开放下载:
我原创的 10 个 Python 可视化作品,今天源码全部开放下载!
3. 过去半年沉淀下来的:《20个Python专题》,我原创的 140 页《20 个Python专题》,都是干货,现在开放下载
4. 今天是NumPy精华学习资料合辑,这包括:
1本图解NumPy小册子PDF
NumPy中文学习网站
我对NumPy向量化、广播、闪电数值计算速度的总结
推荐一个纯NumPy实现常见的machine learning算法库
1本100页NumPy精华PDF
NumPy练习100题原版PDF
文末提供下载方法
1 图解NumPy
NumPy,太通用了,Pandas,SciPy,Tensorflow,scikit-learn 都选它为基础框架,所以Python生态里,掌握NumPy几乎是必须的。
NumPy处理数据,书写精简,能方便地对数据进行切片,切块,多维向量操作。
一般常见的数据类型有四种,以excel或csv为代表的二维数组型表格,还有以单通道或多通道的图像cv文件,还有一维数组格式的音频文件,最后以输入文本为代表的nlp
这些不同种类的输入数据格式,都能通过NumPy方便的表示和处理。正因如此,进一步强化了NumPy的王者地位。
就拿32乘32像素的黑白图片而言,只需一行代码便提取出左上角的10个像素块:
In [11]: a=np.random.randint(0,255,size=(32,32))
# 提取左上角的10*10的像素块
In [14]: a[:10,:10]
Out[14]:
array([[115, 168, 94, 97, 208, 249, 94, 11, 194, 185],
[ 77, 130, 203, 188, 243, 207, 229, 213, 170, 52],
[250, 98, 7, 234, 69, 188, 152, 66, 210, 159],
[228, 252, 122, 126, 36, 126, 210, 176, 60, 136],
[103, 26, 98, 57, 56, 206, 221, 9, 165, 90],
[ 47, 188, 55, 92, 169, 4, 150, 200, 105, 84],
[241, 36, 161, 3, 57, 198, 216, 26, 33, 13],
[ 34, 65, 175, 213, 52, 159, 7, 102, 102, 133],
[214, 192, 38, 252, 12, 71, 38, 44, 165, 135],
[234, 105, 130, 189, 162, 247, 58, 80, 88, 83]])
接下来,看看NumPy的基础用法。
要想快速掌握NumPy,要理解一些基本原理,如应用最广泛的reshape方法,通过它能将一维数组转为多维,反之亦然。表象为多维,实质在内存中始终为一维。
结合图形可视化,加速理解NumPy中的这些基本运算,如两个一维数组相加的可视化:
再有,NumPy的重要机制之一:广播,可能有些读者对其有些迷惑,不知何为广播,借助可视化图,一看便知:
1个1.6,被广播为2个1.6,原因是要与前面的数组长度匹配上,然后逐元素相加。
除了数组对象之外,NumPy又封装一个矩阵对象,它能提供线代中的点乘操作,这是机器学习公式运算所需要的,点乘的可视化图形为:
点乘实际上等价于:
其他剩余操作,如按块索引、常见聚合操作,也有对应的可视化图。
2 NumPy 中文网站
记住NumPy中文网站:https://www.numpy.org.cn/,里面包括NumPy 的官档中文版,使用入门,实战等。
里面包括NumPy官档最详细的一个中文翻译,地址为:
https://www.numpy.org.cn/reference/
平时遇到关于NumPy的bug,解决不了的,可以先去这里查看API的使用说明。
3 理解 NumPy 向量化和广播
理解NumPy的向量化能力,这正是赋予它简洁的重要原因之一。使用Python原生API会经常写些for,但是NumPy让它变得不再需要,NumPy一切都是按照向量计算。如下计算小于3的元素置0,否则置为1:
# 使用Python原生
a = [10,4,-6,3,5,1]
# 小于3的元素置为0,不小于3的元素置为1
b = []
for i in a:
b.append(0 if i < 3 else 1)
print(b)
使用 NumPy 的where方法,语法更加简洁,看不到for语句,符合Python哲学:
# 使用NumPy
na = np.array(a)
# 一行代码
b = np.where(na < 3, 0, 1)
print(b)
处理多维数组,NumPy的索引和切片更强大,如下 na < 3 得到布尔索引,一切都按照向量化操作:
na = np.array([10,4,-6,3,5,1])
na[na < 3]
# 结果如下:
# array([-6, 1])
# 创建二维数组
np.random.randint(1,10,size=(3,4))
c2 = np.random.randint(1,10,size=(3,4))
c2
array([[3, 2, 9, 9],
[9, 5, 2, 4],
[8, 1, 2, 4]])
# 更强大简洁的切片功能:
c2[:2,1:3]
array([[2, 9],
[5, 2]])
学习NumPy,不可能不与广播打交道,广播机制必须要理解,关于它的规则可参考:
https://www.numpy.org.cn/article/basics/python_numpy_tutorial.html#%E5%B9%BF%E6%92%AD-broadcasting
4 纯NumPy实现machine learning算法
NumPy往往是数据分析、机器学习、深度学习相关框架的底层框架,NumPy在这方面的实战,都有哪些呢?
在这里推荐一个纯NumPy实现各种常见机器学习、深度学习算法的github库,地址为:
https://github.com/ddbourgin/numpy-ml
5 NumPy数值计算速度强劲
一起重温NumPy中一些有趣且重要的特性。NumPy 最核心的一个对象:ndarray,封装的多维数组,除了存储数据本身外,还会记录元素类型即 dtype,且每个元素占用内存大小都均匀相等,如下创建 8 个 int64 型整数,计算总字节数的方法:
import numpy as np
a = np.arange(8).reshape(2,4)
a
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
# 计算占用占用的字节数
a.size * a.itemsize
64
数据分析工作,NumPy二维数组用的多;数据挖掘的话,高维数组用的就会更多,NumPy的强项正在于此,正所谓Python没有的NumPy有,Python有的NumPy更强。如下,创建同样shape的随机数组,Python要比NumPy慢232倍:
In[5]: %timeit np.random.randint(1,1000,(100,1000))
332 µs ± 2.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
]
In[6]: import random
In[6]: %timeit [random.randint(1,100) for _ in range(100) for _ in range(1000)]
77.2 ms ± 315 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 创建同样的(100,1000)的随机数组
# Python原生是NumPy计算耗时的232倍
In[7]: 77.2 * 1000 / 332
232.53012048192772
NumPy 闪电处理速度,主要得益于操作直接发生在元素级,而 Python 会创建更多其他额外对象,数据处理性能上无法与NumPy相媲美。
正无穷在NumPy中是 np.inf,空值是 np.nan ,它们都是一个类对象。
更多知识,比如数据类型 int63, float32,...,astype类型转化,reshape函数,数组扁平操作ravel, flatten,切片和索引,按照向量的加减乘除,统计函数,等等
这个阶段可以选择《NumPy 100页精华》PDF,现在送给你
6 NumPy练习100题原版
NumPy 练习 100 题,作者是 rougier,是计算神经科学领域的研究员,在开源的这100道练习题中,循着使用NumPy的逻辑展开,第一题是关于如何导入 NumPy,一直最后讲到使用NumPy的高级方法,如logical_and,diff 等
下载以上资料的方法:
1. 长按下方二维码,关注我的视频号;
2. 关注后,在视频号内私信我,并备注:np