Numpy 使用前需要导入 numpy,一般写作
import numpy as np
可通过 np.+Tab 来查看可使用的函数,并通过 函数 + ?来查看函数的具体帮助信息。
1. ndarray 的创建和使用
Numpy 封装了一个心得数据类型 ndarray,它是一个多维数组对象。该对象封装了许多常用的数学运算函数。创建它的方法主要为以下几种:
1.1 直接将python的基本数据类型转换为ndarray
1)将列表转换为ndarray
import numpy as np
lst1 = [3,2,34,1,0]
nd1 = np.array(lst1)
print(nd1)
print(type(nd1))
2) 嵌套列表可以转换为多为ndarray
import numpy as np
lst2 = [[3,0,34,2,4],[2,4,1,4,5]]
nd2 = np.array(lst2)
print(nd2)
print(type(nd2))
将上述例子中的列表转换为元组同样适用。
1.2 利用random 模块生成数组
如果需要对数组进行一些条件设置,可以适用random。可以用来进行算法的初始化,如正态分布或均匀分布等。下面列举 np.random 模块常用的函数:
函数 | 描述 |
---|---|
np.random.random | 生成0到1之间的随机数 |
np.random.uniform | 生成均匀分布的随机数 |
np.random.randn | 生成标准正态的随机数 |
np.random.randint | 生成随机的整数 |
np.random.normal | 生成正态分布 |
np.random.shuffle | 随机打乱顺序 |
np.random.seed | 设置随机数种子 |
random_sample | 生成随机的浮点数 |
1.3 创建特定形状的多维数组
参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用下表的函数来实现。
函数 | 描述 |
---|---|
np.zeros((4,5)) | 创建4✖5的全为0的数组 |
np.ones((4,5)) | 创建4✖5的全为1的数组 |
np.empty((4,5)) | 创建4✖5的空数组,数组中的值并不为0,而是未初始化的数值 |
np.zeros_like(aa) | 以aa相同维度创建元素全为0的数组 |
np.ones_like(aa) | 以aa相同维度创建元素全为1的数组 |
np.empty_like(aa) | 以aa相同维度创建空数组 |
np.eye(4) | 该函数创建一个4✖4的单位矩阵I |
np.full((4,5),233) | 创建4✖5的元素全为233的数组,233为指定值 |
将生成的数据保存
import numpy as np
nd3 = np.random.random([4,5])
np.savetxt(X = nd3, fname = './test1.txt')
nd4 = np.loadtxt('./test1.txt')
1.4 利用 arange、linspace 函数生成数组
arrange 是 numpy 模块中的函数,其格式是:
arrange([start,] stop[,step,], dtype=None)
其中,start(默认为0) 和stop 是用来指定范围, step(可以是小数) 用来设定步长。
import numpy as np
print(np.arange(10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(0,10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(1,4,0.5))
# [1. 1.5 2. 2.5 3. 3.5]
print(np.arange(9,-1,-1))
#[9 8 7 6 5 4 3 2 1 0]
linspace 也是numpy 模块中常用的函数,它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等份向量,其格式为:
np.linspace(start, stop, num=50, endpoint = True, retstep = False, dtype = None)
2. 基本操作
2.1 获取数据
import numpy as np
np.random.seed(2021)
nd5 = np.randdom.random([10])
# 获取指定位置的数据,获取第3个元素
nd5[2]
# 截取一段数据
nd5[2:5]
# 截取固定间隔数据
nd5[1:6:2]
# 倒序取数
nd5[::-2]
#截取一个多维数组的一个区域内数据
nd6 = np.arange(25).reshape([5,5])
nd6[1:4,1:4]
# 截取一个多维数组中,数值在一个值域之内的数据
nd6[(nd6 > 2)& (nd6 < 9)]
# 截取多为数组中,指定的行,如读取第3,4行
nd6[[2,3]] # or nd6[[2:4,:]]
# 截取指定的列
nd6[:,2:4]
除了通过上述的方法外,还可以通过一些函数来实现,如random.choice 函数从指定的样本中随机抽取数据。
import numpy as np
from numpy import random as nr
a = np. arange(1,25,dtype = float)
c1 = nr.choice(a,size = (2,3)) # the size is the shape of the array c1
c2 = nr.choice(a,size = (2,3),replace = False) # when replace is True, the function can repreat choice one number.
# the paremeter p is the probability of extraction for each element,defaule is same.
c3 = nr.choice(a, size = (2,3), p = a./np.sum(a))
print("repreat")
print(c1)
print("can not repreat")
print(c2)
print("repreat and probaility")
print(c3)
3. Numpy 的算数运算
主要介绍两种常用的运算:对应元素相乘和点积或内积。
3.1 对应元素相乘
numpy.multiply(x1,x2,/,out = None, *, where = True, casting='same_kind', order = 'K',
dtype = None, subok=True[, signature, extobj])
操作可以进行两个矩阵对应相乘或者和单一数值进行运算。
import numpy as np
A = np.array([[1,2],[0,4]])
B = np.array([[3,5],[2,1]])
A * B # or np.multiply(A,B)
print(A*2.0)
print(A/2.0)
###可以进行一些激活函数的设置
X = np.random.rand(2,3)
def softmid(x):
return 1/(1 + np.exp(-x))
def relu(x):
return np.maximun(0,x)
def softmax(x):
return np.exp(x)/np.sum(np.exp(x))
3.2 点积运算
点积运算(Dot Product)又称为内积:
numpy.dot(a,b, out = None):a 的行要与 b的列保持一致。
import numpy as np
X1 = np.array([[1,2],[3,4]])
X2 = np.array([[3,5,4],[1,5,2]])
X3 = np.dot(X1,X2)
print(X3)
4. 数组变形
4.1 更改数组的形状
函数 | 描述 |
---|---|
arr.reshape | 重新将向量arr维度进行改变,不修改向量本身 |
arr.resize | 重新将向量arr维度进行改变,修改向量本身 |
arr.T | 对向量arr进行转置 |
arr.ravel | 对向量arr进行展平,即将多维数组变成1维数组,不回产生原数组的副本 |
arr.flatten | 对向量arr进行展平,即将多维数组变成1维数组,返回原数组的副本 |
arr.squeeze | 只能对维数维1的数组降维。对多维数组使用时不会报错,但是不会产生任何影响 |
arr.transpose | 对高为矩阵进行轴对换 |
import numpy as np
arr = np.arange(10)
print(arr)
print(arr.reshape(2,5))
print(arr.reshape(5,-1)) # reshape 函数不支持指定行数或列数,所以-1在这里是有必要的
print(arr.reshape(-1,5))# 行数或列数一定是能够被整除
'''
[[0 1 2 3 4]
[5 6 7 8 9]]
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
[[0 1 2 3 4]
[5 6 7 8 9]]
'''
# ravel
arr = np.arange(12).reshape(2,-1)
print(arr)
print("按照列优先,展平")
print(arr.ravel('F'))
print("按照行优先,展开")
print(arr.ravel())
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
按照列优先,展平
[ 0 6 1 7 2 8 3 9 4 10 5 11]
按照行优先,展开
[ 0 1 2 3 4 5 6 7 8 9 10 11]
'''
# flatten: 将矩阵转为向量,这种需求经常出现在卷积网络与全连接层之间。
a = np.floor(10*np.random.random((3,4)))
print(a)
print(a.flatten())
'''
[[8. 3. 8. 1.]
[3. 2. 2. 9.]
[7. 4. 0. 0.]]
[8. 3. 8. 1. 3. 2. 2. 9. 7. 4. 0. 0.]
'''
# transpose: 对高维矩阵进行轴对话,如把图片中表示颜色顺序的RGB改为GBR
arr2 = np.arange(24).reshape(2,3,4)
print(arr2.shape)
print(arr2.transpose(1,2,0).shape)
'''
(2, 3, 4)
(3, 4, 2)
'''
4.2 合并数组
函数 | 描述 |
---|---|
np.append | 内存占用大 |
np.concatenate | 没有内存问题 |
np.stack | 沿着新的轴加入一系列数组 |
np.hstack | 堆栈数组垂直顺序(行) |
np.vstack | 堆栈数组垂直顺序(列) |
np.dstack | 堆栈数组按顺序深入(沿第3维) |
np.vsplit | 将数组分解成垂直的多个子数组的列表 |
5. 批量处理
批量数据(Mini-Batch)一般用来处理大规模数据。可通过以下步骤:
得到数据集;随机打乱数据;定义批大小;批处理数据集
# 生成10000个形状为2✖3的矩阵
data_train = np.random.randn(10000,2,3)
print(data_train.shape)
# 打乱这10000条数据
np.random.shuffle(data_train)
#定义批大小
batch_size = 100
# 进行批处理
for i in range(0,len(data_train),batch_size):
x_batch_sum = np.sum(data_train[i:i+batch_size])
print("第{}批次,该批次的数据之和:{}".format(i,x_batch_sum))
6. 通用函数(ufunc)
它是一种能对数组的每个元素进行操作的函数,它比math模块中的函数更灵活,可以利用向量或矩阵来避免使用循环语句,这点非常重要。
函数 | 使用方法 |
---|---|
sqrt | 计算序列化数据的平方根 |
sin,cos | 三角函数 |
abs | 计算序列化数据的绝对值 |
dot | 矩阵运算 |
log,log10,log2 | 对数函数 |
exp | 指数函数 |
cumsum,cumproduct | 累计求和、求积 |
sum | 对一个序列化数据进行求和 |
mean | 计算均值 |
median | 计算中位数 |
std | 计算标准差 |
var | 计算方差 |
corrcoef | 计算相关系数 |
6.1 math 和 numpy 函数的性能比较
import time
import math
import numpy as np
x = [i * 0.001 for i in np.arange(1000000)]
start = time.perf_counter()
for i,t in enumerate(x):
x[i] = math.sin(t)
print("math.sin: ", time.perf_counter() - start)
x = [i * 0.001 for i in np.arange(1000000)]
x = np.array(x)
start = time.perf_counter()
x = np.sin(x)
print("numpy.sin: ", time.perf_counter() - start)
'''
math.sin: 0.2484094000000141
numpy.sin: 0.0017265000000179498
'''
7. 总结
如果想了解更多的内容,可以登录Numpy 官方网站(http://www.Numpy.org/)查看更多内容。