Numpy基础
数组变形
reshape
定义:重新将向量arr维度进行改变,不修改向量本身。即:不影响原地址下的内容,创建一个副本结果并输出。
import numpy as np
arr = np.arange(10)
print(arr)
# 将向量arrr维度变换为2行5列
print(arr.reshape(2, 5))
# 指定维度时可以只指定行数或列数,其他用-1代替
print(arr.reshape(5,-1))
print(arr.reshape(-1, 5))
输出结果
resize
定义:改变向量维度的同时修改向量本身,即:对原地址内容的修改。
import numpy as np
arr = np.arange(10)
print(arr)
# 将向量arr维度变换为2行5列
arr.resize(2, 5)
print(arr)
输出结果
T
定义:向量转置,不会对原地址的内容造成影响。
import numpy as np
arr = np.arange(12).reshape(3, 4)
# 向量arr为3行4列
print(arr)
# 将向量arr进行转置为4行3列
print(arr.T)
输出结果
ravel
定义:对原始向量展平,即将多维数组变成1维数组,不会对原地址下的内容作出修改。
import numpy as np
arr = np.arange(6).reshape(2, -1)
print(arr)
# 按照列优先,展平
print("按照列优先展平")
print(arr.ravel('F'))
# 按照行优先,展平
print("按照行优先展平")
print(arr.ravel())
输出结果
flatten
定义:对原始向量展平,即将多维数组变成1维数组,不会对原地址下的内容作出修改,但会返回原数组的副本。
import numpy as np
a = np.floor(10*np.random.random((3, 4)))
print(a)
print(a.flatten())
输出结果
squeeze
定义:这时一个主要用来降维的函数,把矩阵含1的维度去掉。
import numpy as np
arr = np.arange(3).reshape(3, 1)
print(arr.shape)
print(arr.squeeze().shape)
arr1 = np.arange(6).reshape([3, 1, 2, 1])
print(arr1.shape)
print(arr1.squeeze().shape)
输出结果
transpose
定义:对高维矩阵进行轴对称。
import numpy as np
arr2 = np.arange(24).reshape([2, 3, 4])
print(arr2.shape)
print(arr2.transpose(1, 2, 0).shape)
输出结果
合并数组
几点说明:
(1)append, concatenate 以及stack都有一个axis参数,用于控制数组的合并方式是按行还是按列。
(2)对于append, concatenate,待合并的数组必须有相同的行数或列数(满足一个即可)。
(3)stack要求待合并的数组必须具有相同的形状。
append
合并多维数组:
import numpy as np
a = np.arange(4).reshape(2, 2)
b = np.arange(4).reshape(2, 2)
# 按行合并
c = np.append(a, b, axis=0)
print('按行合并后的结果')
print(c)
print('合并后数据维度', c.shape)
# 按列合并
d = np.append(a, b, axis=1)
print('按列合并后的结果')
print(d)
print('合并后数据维度', d.shape)
输出结果
concatenate
沿指定轴连接数组或矩阵。
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
c = np.concatenate((a, b), axis=0)
print(c)
d = np.concatenate((a, b.T), axis=1)
print(d)
输出结果
stack
沿指定轴堆叠数组或矩阵。
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.stack((a, b), axis=0))
输出结果
批量处理
深度学习的计算一般比较复杂,并且数据量一般比较大,为了更加有效的计算,一般将整个数据集分批次处理。
如何把大数据拆分成多个批次呢?可采用以下步骤:
(1)得到数据集
(2)随机打乱数据
(3)定义批大小
(4)批处理数据集
import numpy as np
# 生成10000个形状为2*3的矩阵
data_train = np.random.randn(10000, 2, 3)
# 这是一个3维矩阵,第1个维度为样本数,后两个是数据形状
print(data_train.shape)
# 打乱这10000条数据
np.random.shuffle(data_train)
# 定义批量大小
batch_size=100
# 进行批处理
for i in range(0, len(data_traiin), batch_size):
x_batch_sum=np.sum(data_train[i:i+batch_size])
print('第{}批次,该批次的数据之和:{}'.format(i, x_batch_sum))
广播机制
调整数组使得shape一样,满足一定的规则:
(1)让所有输入数组都向其中shape最长的数组看齐,不足的部分则通过在前面加1补齐。
(2)输出数组的shape是输入数组shape的各个轴上的最大值。
(3)如果输入数组的某个轴和输出数组的对应轴的长度相同,或者某个轴的长度为1时,这个数组能被用来计算,否则出错。
(4)当输入数组的某个轴的长度为1时,沿着此轴运算时都用(或复制)此轴上的第一组值。
示例:
import numpy as np
A = np.arange(0, 40, 10).reshape(4, 1)
B = np.arange(0, 3)
print("A矩阵的形状:{},B矩阵的形状:{}".format(A.shape,B.shape))
C = A+B
print("C矩阵的形状:{}".format(C.shape))
print(C)
补充:random模块中choice函数的用法
import numpy as np
from numpy import random as nr
a = np.arange(1, 25, dtype=float)
c1 = nr.choice(a, size=(3, 4)) # size指定输出数组形状
c2 = nr.choice(a, size=(3, 4), replace=False) # replace缺省为True,即可重复抽取
# 下式中参数p指定每个元素对应的抽取概率,缺省为每个元素被抽取的概率相同
c3 = nr.choice(a, size=(3, 4), p = a / np.sum(a))
print('随机可重复抽取')
print(c1)
print('随机但不重复抽取')
print(c2)
print('随机但按制度概率抽取')
print(c3)
参考文献
吴茂贵,郁明敏,杨本法,李涛,张粤磊. Python深度学习(基于Pytorch). 北京:机械工业出版社,2019.