Numpy(Numerical Python的缩写)
- 一个开源的Python科学计算库
- 使用Numpy可以方便的使用数组、矩阵进行计算
- 包括线性代数、傅里叶变换、随机数生成等大量函数
为什么使用numpy
对于同样的数值计算任务,使用Numpy比直接编写Python代码实现,有以下优点
- 代码更简洁:Numpy直接以数组、矩阵为粒度计算并且支持大量的数学函数,如果没有Numpy,Python需要for循环从底层实现
- 性能更高效:Numpy的数组存储效率和输入输出计算性能比Python使用列表强很多。这里体现为两点。第一点,Numpy的数据存储和Python原生的List是不一样的,第二点,Numpy的大部分代码是C写的,效率比Python高。
Numpy是Python各种数据科学类库的基础库
比如:Scipy、Scikit-Learn、Tensorflow、PaddlePaddle等,如果不会Numpy,这些库的学习都会遇到障碍。
Numpy和原生Python的性能对比
需求:实现两个数组的加法
数组A是1~N数字的平方
数组B是1~N数字的立方
纯python实现
def sum_add(n):
"""
纯python实现两个数组的加法
:param n:
:return:
"""
square = [i ** 2 for i in range(1, n + 1)]
cube = [i ** 3 for i in range(1, n + 1)]
c = []
for i in range(n):
c.append(square[i] + cube[i])
return c
def numpy_add(n):
"""
numpy实现两个数组的加法
:param n:
:return:
"""
a = np.arange(n) ** 2
b = np.arange(n) ** 3
return a + b
numpy在使用之前需要导入numpy
import numpy as pd
array的使用
array的背景
- Numpy的核心数据结构,array就是数组,array对象可以是一维数组,也可以是多维数组;
- Python的List可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数;
- Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”
- Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因;
array本身的属性
- shape:返回一个元组,表示array的维度
- ndim:—个数字,表示array的维度的数目
- size:—个数字,表示array中所有数据元褰的数目
- dtype: array中元素的数据类型
写一个代码来测试这些属性
"""
@description:使用Python的list和嵌套list来创建一维array和二位array
@author:baola
@time:2020/8/10 11:17
@Python_version: 3.8.5
"""
import numpy as np
# 创建一个一维数组
dim1= np.array([1, 2, 3, 4, 5, 6, 7, 8])
# 创建一个二维数组
dim2 = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8]
]
)
print('********dim1*******')
print('dim1:', dim1)
print('********dim2*******')
print('dim2:', dim2, '\n')
# array的属性
print('dim1.shape: ', dim1.shape, 'dim1.ndim: ', dim1.ndim, ' dim1.size: ', dim1.size, ' dim1.type:', dim1.dtype)
print('dim2.shape: ', dim2.shape, 'dim2.ndim: ', dim2.ndim, ' dim2.size: ', dim2.size, ' dim2.type:', dim2.dtype)
创建array的方法
方法1:从Python的列表List和嵌创list来创建一维array和二位array
import numpy as pd
# 创建一个一维数组
dim1= np.array([1, 2, 3, 4, 5, 6, 7, 8])
# 创建一个二维数组
dim2 = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8]
]
)
print('********dim1*******')
print('dim1:', dim1)
print('********dim2*******')
print('dim2:', dim2)
方法2:使用预定函数arange、ones/onesjike、zeros/zerosjike、empty/empty_like、full/fulljike、eye等函数创建
使用arange创建数字序列
# arange([start,] stop[, step,], dtype=None) 和Python的range类似
print(np.arange(10)) # [0 1 2 3 4 5 6 7 8 9]
print(np.arange(2, 10, 2)) # [2 4 6 8]
使用ones创建全是1的数组
# ones(shape, dtype=None, order='C')
# 创建全是1的一维数组
print(np.ones(10))
# 创建一个3行4列全是1的数组
print(np.ones((3, 4)))
使用ones_like创建形状相同的数组
# Return an array of ones with the same shape and type as a given array.
a = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8]
]
) # 之后的数组参数都用a演示
print(np.ones_like(a))
zero/zeros_like和ones/ones_like用法和功能类似,产生的值全为0;
empty
和empty_like
根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化(arbitrary data)。
# empty 用的很少,创建一个未初始化的数组,数组的值是随机值
# Return a new array of given shape and type, without initializing entries.
print(np.empty(10))
print((np.empty_like((2, 4))))
# empty_like 用的很少,创建一个形状相同的数组,数组的值是随机值
# Return a new array with the same shape and type as a given array.
print(np.empty_like(a))
使用full
创建指定值的数组
"""
使用full创建指定值的函数
full(shape, fill_value, dtype=None, order='C')
Return a new array of given shape and type, filled with `fill_value`.
"""
print(np.full(10,333))
print(np.full((2, 4), 666))
"""
full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)
Return a full array with the same shape and type as a given array.
"""
print(np.full_like(a, 666))
生成随机数的np.random
模块构建随机数的数组
"""
randn(d0, d1, ..., dn)
"""
print(np.random.randn())
print(np.random.randn(10))
print(np.random.randn(2, 4))
print(np.random.randn(2, 2, 2))
array本身支持的大置橾作和函数
- 直接逐元素的加减乘除等算数操作
- 更好用的面向多维的数组索引
- 求sum/mean等聚合函数
- 线性代数函数,比如求解逆矩阵、求解方程组
代码演示:
# 改变array的形状
print(np.arange(10).reshape(2, 5))
"""
输出:
[[0 1 2 3 4]
[5 6 7 8 9]]
"""
"""
对数组中每一个元素进行算数操作
"""
a = np.arange(10).reshape(2, 5)
print('a + 1 = ', a + 1)
print('a - 1 = ', a - 1)
print('a*2 = ', a*2)
print('a/0.5', a/0.5)
"""
对两个数组之间的每个元素进行操作
"""
b = np.arange(0, 20, 2).reshape(2, 5)
print(np.arange(0, 20, 2))
print('a+b = ', a+b) # 两个数组间的每个元素进行加法操作得到一个新的数组
print('a-b = ', a-b)