数组、向量
基于学习Numpy的探索过程(最后有说明),本文从初学者的视角对Numpy模块进行全面了解,给出学习建议与重要的资料检索,不定期更新。在帮自己梳理之外,希望能够给初学者一些帮助。
Numpy是Python科学计算领域中比较基础的包,对多维矩阵的计算、线性代数计算、傅立叶变换、随机数的生成等有非常好的支持。关于Numpy的学习强烈建议从官方文档和源码开始,必要时Google搜索和Stack Overflow提问,最后的办法是去源码的Issue提问。
- 官方文档:其中的Quickstart tutorial是新手起航的绝佳说明。
- Github源码
特别说明
补充一些常用的经典函数说明
随机数生成
在构造矩阵时,利用随机数生成是常用的方法,在Reference查表可以找到随机数生成的模块函数清单,根据说明选择自己需要的函数。
np.random.randint
:用来生成指定的整形随机数数组
x_arr = np.random.randint(-1,2,10)
y_arr = np.random.randint(-1,2,10)
coordinate = np.column_stack((x_arr,y_arr))
coordinate
常用函数
np.where
针对矩阵做有条件的赋值,非常便捷好用。
import numpy as np
a = np.arange(9).reshape(3,3)
b = np.where(a > 3,1,0)
b
结果为
array([[0, 0, 0],
[0, 1, 1],
[1, 1, 1]])
np.vectorize
用于对某一个函数向量化,输出另一个向量化的函数。以Python实现质数求和的问题举例,下面定义了一个判断质数的函数,返回值为布尔型。
def is_prime(x):
for i in range(2,x):
if x%i == 0:
return False
else:
return True
利用np.vectorize对is_prime进行向量化。
np.vectorize(is_prime)
得到的是一个基于函数的向量化函数。
<numpy.lib.function_base.vectorize at 0x108f71c50>
给得到的函数赋一个数组,得到布尔型的数组。
x = np.vectorize(is_prime)
arr = np.arange(2,10)
x(arr)
结果如下:
array([ True, True, False, True, False, True, False, False], dtype=bool)
官方文档
Quickstart tutorial深入浅出,给出了学习的重要逻辑:
- 了解数组ndarray本身的属性:ndarray.ndim、ndarray.shape、ndarray.size、ndarray.dtype、ndarray.itemsize、ndarray.data。
- 学会构造数组,这是很基础的一个步骤,在后续的学习实验中根据需要设置实验环境的基础。常用的方法有:array,arrange, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile。
- 输出数组,方法简单,但是可以根据需要调整不同的参数。
- 后续的更多操作,参见下表,给出了Tutorial的目录翻译逻辑。
英文一级目录 | 二级目录 | 中文说明 | 备注 |
---|---|---|---|
The Basics | 基础知识 | ||
An example | 基本案例 | ||
Array Creation | 数组创建 | ||
Printing Arrays | 数组输出 | ||
Basic Operations | 基础操作 | ||
Universal Functions | 通用函数 | ||
Indexing, Slicing and Iterating | |||
Shape Manipulation | |||
Changing the shape of an array | 改变数组的形状 | ||
Stacking together different arrays | 数组的组合 | ||
Splitting one array into several smaller ones | 数组的拆分 | ||
Copies and Views | |||
No Copy at All | |||
View or Shallow Copy | |||
Deep Copy | 深度复制 | ||
Functions and Methods Overview | 函数和方法总览 | ||
Less Basic | |||
Broadcasting rules | 广播规则 | ||
Fancy indexing and index tricks | |||
Indexing with Arrays of Indices | |||
Indexing with Boolean Arrays | |||
The ix_() function | |||
Indexing with strings | |||
Linear Algebra | 线性代数 | ||
Simple Array Operations | 简单的数组操作 | ||
Tricks and Tips | 一些技巧和提示 | ||
“Automatic” Reshaping | |||
Vector Stacking | |||
Histograms |
案例展示
纯理论的Numpy文档看完后,利用更明确的问题或者题目来引导学习更加有效。
- ** 利用向量化的方法计算100以内质数的和?**:在这篇博客中提到了向量化的解决办法,可以参考。
- 100 numpy exercises:非常有趣的100道Numpy训练题,并且有公开的Github仓库。其中没有答案的文档,建议直接下载做题,我会在后续的学习中针对这份材料进行翻译和选取内容学习。
- Numpy tutorial:通过一个案例展示了Numpy包与纯Python方法在一个问题上的求解过程差异,学有余力可以参考。
探索过程
- 2016年9月因为数据科学课的缘故,开始了数据科学之旅。第一次探索Numpy等一系列开源工具包。现在想来,能够误打误撞的坚持下来真是“无知者无畏”。那个时候为了完成课程作业找到了官方文档,并没有系统的阅读。作业算是完成了,心中积累了不少的问题。
- 2016年11月底,自己决定把数据科学课的内容回炉。没有了外在压力,自己看的非常细致,Quickstart tutorial读完,豁然开朗,新建了这篇博客笔记。
- 在Matplotlib的探索过程里不断发现新的资源,对于Numpy的学习提供了更明确的思路,加入文档。
[完](http://blog.junyu.pro)
声明: 本文转载需标明出处,禁止用于商业目的。
ChangeLog
161201 新建 161203 发布