深度学习笔记(基于pytorch)——Numpy基础

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))

输出结果
深度学习笔记(基于pytorch)——Numpy基础

resize

定义:改变向量维度的同时修改向量本身,即:对原地址内容的修改。

import numpy as np
arr = np.arange(10)
print(arr)
# 将向量arr维度变换为2行5列
arr.resize(2, 5)
print(arr)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

T

定义:向量转置,不会对原地址的内容造成影响。

import numpy as np

arr = np.arange(12).reshape(3, 4)
# 向量arr为3行4列
print(arr)
# 将向量arr进行转置为4行3列
print(arr.T)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

ravel

定义:对原始向量展平,即将多维数组变成1维数组,不会对原地址下的内容作出修改。

import numpy as np

arr = np.arange(6).reshape(2, -1)
print(arr)
# 按照列优先,展平
print("按照列优先展平")
print(arr.ravel('F'))
# 按照行优先,展平
print("按照行优先展平")
print(arr.ravel())

输出结果
深度学习笔记(基于pytorch)——Numpy基础

flatten

定义:对原始向量展平,即将多维数组变成1维数组,不会对原地址下的内容作出修改,但会返回原数组的副本。

import numpy as np
a = np.floor(10*np.random.random((3, 4)))
print(a)
print(a.flatten())

输出结果
深度学习笔记(基于pytorch)——Numpy基础

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)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

transpose

定义:对高维矩阵进行轴对称。

import numpy as np

arr2 = np.arange(24).reshape([2, 3, 4])
print(arr2.shape)
print(arr2.transpose(1, 2, 0).shape)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

合并数组

几点说明:
(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)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

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)

输出结果
深度学习笔记(基于pytorch)——Numpy基础

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))

输出结果
深度学习笔记(基于pytorch)——Numpy基础

批量处理

深度学习的计算一般比较复杂,并且数据量一般比较大,为了更加有效的计算,一般将整个数据集分批次处理。
如何把大数据拆分成多个批次呢?可采用以下步骤:
(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))

深度学习笔记(基于pytorch)——Numpy基础

广播机制

调整数组使得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)

深度学习笔记(基于pytorch)——Numpy基础

补充: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)

深度学习笔记(基于pytorch)——Numpy基础

参考文献

吴茂贵,郁明敏,杨本法,李涛,张粤磊. Python深度学习(基于Pytorch). 北京:机械工业出版社,2019.

上一篇:张量tensor高维数组的理解(Tensor 与numpy操作类似,本文以高维数组举例)


下一篇:OO题目集7~9总结