Numpy
转载请注明出处 😃!
手动反爬:Numpy(安装、生成、运算、变形、合并、拆分、矩阵)
https://blog.youkuaiyun.com/Lyun911/article/details/112250455
注:以下使用 Jupyter Notebook 演示
1 Numpy和 SciPy概述
Numpy环境要求:
系统:Win7/ Win10/ MacOS10.10+
环境:Python3.7+ 或者 Anaconda
1.1 科学计算是什么
科学计算主要是利用计算机的算力进行数据的计算和方程求解,具体包括如下内容:
- 一个强大的 N维数组对象 ndarray:比如三维数组 x,y,z表示为:[ [2, 2], [3, 3], [4, 4] ],又比如一个电脑的配置cpu,gpu,ram,rom…各种配置排列组合以后形成一个N维数组
- 广播功能函数:假设有一个 33的矩阵,让其 +5,正常情况下无法直接加,而广播功能可以让 33矩阵中的每一个数字都 +5
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换(比如音乐 UI的波浪会根据声音的强弱等转换为音浪视觉)、随机数生成,微积分求解等功能
1.2 Numpy的历史和发展
NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算
NumPy 为开放源代码并且由许多协作者共同维护开发(Pandas的底层核心是 Numpy)
1.3 Numpy的应用
NumPy
通常与 SciPy
(Scientific Python)和 Matplotlib
(绘图库)一起使用
这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。利用 Python的 PIP包管理器可以方便的安装 Numpy套件,当然也可以利用 Anaconda的套件环境快速安装 Numpy环境
1.4 Pip安装 Numpy、Scipy、Matplotlib、Pandas
打开 CMD运行以下指令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy scipy matplotlib pandas
2 Numpy和 Python List的区别
2.1 Python内置的数组结构
- List:列表
[1, 1, 2, 3]
- Dictionary:字典
{k:v, k:v, k:v}
- Set:集合
set([1, 1, 2, 3]) == {1, 2, 3}
- Numpy Array:Numpy阵列
2.2 Numpy和 List数组的相似处
Storing Data:可存储数据
Mutable:数据可更新(turple 元组不可以更改)
Can be indexed:可索引搜索(有编号,比如0对应第1个数字)
Slicing Operation:可分片(如 [1:3]
可以取出第2-3个数据)
2.3 Numpy和 List数组的不同
List 可以存储不同的数据类型对象:[1, 2, ‘Hey’]
Numpy Array存储的都是同类型数据对象:可以放 int,float等数字类型的数据,但不能放 str
NumpyArray是C语言写的,比List操作快10-100倍,适合大数据分析
Operation 快速操作
2.4 测试
加减乘除:
import numpy
a = numpy.array([3, 3, 3, 3])
b = a + 7
c = b / 3
print(f'{a}\n{b}\n{c}')
[3 3 3 3]
[10 10 10 10]
[3.33333333 3.33333333 3.33333333 3.33333333]
性能测试:
import time
import numpy as np
size_of_vec = 10000000
def python_():
t1 = time.time()
x = range(size_of_vec)
y = range(size_of_vec)
z = []
for i in range(len(x)):
z.append(x[i] + y[i])
return time.time() - t1
ts1 = python_()
def numpy_():
t2 = time.time()
x = np.arange(size_of_vec)
y = np.arange(size_of_vec)
z = x + y
return time.time() - t2
ts2 = numpy_()
print(f'Numpy is {str(ts1 - ts2)} seconds faster')
print(f'Numpy is {ts1 / ts2} times than Python')
Numpy is 2.9236440658569336 seconds faster
Numpy is 64.53442344358783 times than Python
一般情况下,Numpy比 Python快50-100倍
3 Numpy的常见功能
3.0 Help(np.函数名)
首先,用 help
函数可以查看使用说明 instruction
import numpy as np
help(np.array)
3.1 Array()
利用 Array()
可以从一个列表或元组创建一个Numpy数组:
语法:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
其中:
- object :是数组或嵌套的数列
- dtype :是数组元素的数据类型,可选 int或者 float,默认为浮点型
- copy :是设置是否需要复制,默认需要
- order :创建数组的样式,c代表行方向,f代表列方向,a代表任意方向
注意:
创建2维矩阵的时候最好要
a = np.array([[99, 99]])
如果没有两个 [[]]
则会变成1维
a = np.array([99, 99])
3.1.1 List 和 Array创建数组
List和 Numpy互换:
import numpy as np
l = [1, 2, 3, 4, 5]
arr = np.array(l)
li = list(arr)
print(arr)
print(type(arr))
print(li)
print(type(li))
从 List创建 N维数组:
import numpy as np
# 0D Array(标量 Scarlars即 0维数据)
arr0 = np.array(33)
# 1D Array
arr1 = np.array([1, 1, 1])
# 2D Array
arr2 = np.array([[1, 1, 1], [2, 2, 2]])
# 3D Array
arr3 = np.array([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
print(f'{arr0}\n\n{arr1}\n\n{arr2}\n\n{arr3}') # 查看数组的样子
print(arr3.ndim) # 查看数组的维度
3.1.2 Ndmin 参数
创建高维度的数组(N Dimension - N维)
import numpy as np
arr5 = np.array([5, 5, 5], ndmin = 5)
print(arr5)
3.1.3 Dtype 参数
import numpy as np
arr = np.array([1, 2, 3], dtype = np.int)
print(arr)
3.2 Arange()
NumPy arange()是基于数值范围的数组创建数组。
它创建具有均匀间隔的值的ndarray实例,并返回对其的引用。
语法结构:
numpy.arange([start, ]stop, [step, ], dtype=None)
-> numpy.ndarray
3.2.1 Arange() 的一般应用
import numpy as np
# 完整的写法
arr_detail = np.arange(start = 1, stop = 10, step = 3)
print(arr_detail)
# 简单的写法
arr_simple = np.arange(1, 10, 3)
print(arr_simple)
# 取头不取尾
arr_tail = np.arange(1, 10.1, 3)
print(arr_tail)
# step优先级第3,默认为1
arr_tail2 = np.arange(1, 10)
print(arr_tail2)
# start优先级第2,默认为0
arr_start0 = np.arange(10)
print(arr_start0)
# 可以从负数开始
arr_neg = np.arange(-10, 2, 3)
print(arr_neg)
注:np.arange() 是含头不含尾的,如上 arr_tail 和 arr_tail2
注:np.arange() 只有2个值时,默认这2个参数为 start
和 stop
注:np.arange() 只有1个值时,默认从0开始
3.2.2 Arange() 的进阶应用(-step,slicing,.dtype,.itemsize,float32)
import numpy as np
# 反向step
arr_rev = np.arange(5, 1, -1)
print(arr_rev)
# 使用slicing切片器取前2个数
print(np.arange(1, 10, 3)[:2])
# 使用slice切片器让数组反向排序
print(np.arange(1, 10, 3)[::-1])
# 创建空数组
print(np.arange(2, 2))
# 查看数据类型
x = np.arange(5)
print(type(x))
print(x.dtype)
x = np.