NumPy基础知识-新手笔记
标签: NumPy基础知识-新手笔记 Python博客 51CTO博客
2023-07-14 18:24:15 152浏览
数组变形
不同模型接收的输入格式不一样,我们需要将数据处理成符合模型要求的格式。
修改数组的形状
arr.reshape()
arr.reshape():重新对向量arr维度进行改变,不修改向量本身
# reshape函数
import numpy as np
# 生成范围在[0, 10),步长为1的整数
arr = np.arange(10)
print("*"*10+" arr "+"*"*10)
print(arr)
# 将向量arr变换为2行5列
print("*"*10+" 2*5 "+"*"*10)
print(arr.reshape(2, 5))
# 指定维度时可以只指定行数或列数,其他用-1代替 且 行数或列数一定要能被整除。
print("*"*10+" 5行 "+"*"*10)
print(arr.reshape(5, -1)) # 输出5行
print("*"*10+" 5列 "+"*"*10)
print(arr.reshape(-1, 5)) # 输出5列
# 不修改向量本身
print("*"*10+" 不修改向量本身 "+"*"*10)
print(arr)
运行结果:

arr.resize()
arr.resize():重新对向量arr维度进行改变,修改向量本身
import numpy as np
# 生成范围在[0, 10),步长为1的整数
arr = np.arange(10)
print("*"*10+" arr "+"*"*10)
print(arr)
# 将向量 arr 变换为2行5列
arr.resize(2, 5)
print("*"*10+" 修改向量本身 "+"*"*10)
print(arr)
运行结果:

arr.T
arr.T:对向量arr进行转置。注:T后没有()。
import numpy as np
# 生成范围在[0, 15),步长为1,3×5的数组
arr = np.arange(15).reshape(3, 5)
# 将向量 arr 变换为3行5列
print("*"*10+" 3行5列 "+"*"*10)
print(arr)
# 将向量 arr 转置为5行3列
print("*"*10+" 转置:5行3列 "+"*"*10)
print(arr.T) # T 后没有小括号()
# 不修改向量本身
print("*"*10+" 不修改向量本身 "+"*"*10)
print(arr)
运行结果:

arr.ravel()
arr.ravel():对向量arr进行展平,即将多维数组变成1维数组,不会产生原数组的副本。
import numpy as np
# 生成范围在[0, 6),步长为1,2行的数组
arr = np.arange(6).reshape(2, -1)
print("*"*10+" 2行 "+"*"*10)
print(arr)
# 按照行展平 默认:按行优先排序
print("*"*10+" 按照行展平(默认) "+"*"*10)
print(arr.ravel())
# 按照列展平 修改参数
print("*"*10+" 按照列展平(调参) "+"*"*10)
print(arr.ravel('F'))
# # 不修改向量本身
print("*"*10+" 不修改向量本身 "+"*"*10)
print(arr)
运行结果:

arr.flatten()
arr.flatten():对向量arr进行展平,即将多维数组变成1维数组,返回原数组的副本。应用:出现在卷积网络与全连接层之间。
import numpy as np
# 生成范围在[0.0, 1.0)的随机数,组成3行4列的数组。
arr0 = np.random.random((3, 4))
print("*"*10+" arr0 "+"*"*10)
print(arr0)
# 扩大10倍
print("*"*10+" 10*arr0 "+"*"*10)
print(10*arr0) # 类似于 print(10*np.random.random((3, 4)))
# np.floor() 向下取整:不超过输入参数的最大整数
print("*"*5+" 不超过2.9的最大整数 "+"*"*5)
print(np.floor(2.9))
print("*"*5+" 不超过-1.9的最大整数 "+"*"*5)
print(np.floor(-1.9))
# 综上所述:生成范围在[0.0, 10.0)的随机数,组成3行4列的数组,最后向下取整。
arr = np.floor(10*np.random.random((3, 4)))
print("*"*10+" arr "+"*"*10)
print(arr)
# 矩阵转向量,默认按行展开
print("*"*10+" 按照行展平(默认) "+"*"*10)
print(arr.flatten(order='C'))
# 默认按行展开
print("*"*10+" 按照行展平(默认) "+"*"*10)
print(arr.flatten())
print("*"*10+" 按照列展平(调参) "+"*"*10)
print(arr.flatten('F'))
运行结果:

arr.squeeze()
arr.squeeze():主要用于降维,可以把矩阵中含1的维度去掉。对多维数组使用时虽然不会报错,但是不会产生任何影响。

# squeeze()函数
import numpy as np
# 生成范围在[0, 3),步长为1,3行1列的数组
arr = np.arange(3).reshape(3, 1)
print("*"*10+" arr "+"*"*10)
print(arr)
print("*"*10+" 数组的形状 "+"*"*10)
print(arr.shape)
print("*"*10+" 矩阵中含1的维度去掉 "+"*"*10)
print(arr.squeeze().shape)
# 生成范围在[0, 6),步长为1,3个3维的数组(每个3维数组由1个2行1列的矩阵组成)
arr1 = np.arange(6).reshape(3, 1, 2, 1)
print("*"*10+" arr1 "+"*"*10)
print(arr1)
print("*"*10+" 数组的形状 "+"*"*10)
print(arr1.shape)
print("*"*10+" 矩阵中含1的维度去掉 "+"*"*10)
print(arr1.squeeze().shape)
运行结果:

arr.transpose()
arr.transpose():对高维矩阵进行轴对换。应用:把图像表示颜色的RGB顺序改为GBR的顺序(循环左移)

# arr.transpose()函数
import numpy as np
# 生成范围在[0, 24),步长为1,2个3行4列的2维数组
arr = np.arange(24).reshape(2, 3, 4)
print("*"*10+" arr "+"*"*10)
print(arr)
print("*"*10+" 数组的形状 "+"*"*10)
print(arr.shape)
print("*"*10+" 纬度值:循环左移 "+"*"*10)
# 0表示reshape中的第1个维度值,1表示reshape中的第2个维度值,2表示reshape中的第3个维度值。
print(arr.transpose(0, 1, 2).shape)
# 1表示reshape中的第2个维度值,2表示reshape中的第3个维度值,0表示reshape中的第1个维度值。
print(arr.transpose(1, 2, 0).shape)
# 2表示reshape中的第3个维度值,0表示reshape中的第1个维度值,1表示reshape中的第2个维度值。
print(arr.transpose(2, 0, 1).shape)
# 0表示reshape中的第1个维度值,1表示reshape中的第2个维度值,2表示reshape中的第3个维度值。
print(arr.transpose(0, 1, 2).shape)
运行结果:

合并数组
np.append()
np.append():内存占用大。

# append()函数
import numpy as np
# 合并一维数组
a = np.array([1, 2, 3])
print("*"*10+" a "+"*"*10)
print(a)
b = np.array([4, 5, 6])
print("*"*10+" b "+"*"*10)
print(b)
c = np.append(a, b) # b的值在a后
print("*"*10+" c "+"*"*10)
print(c)
运行结果:

# 合并多维数组
import numpy as np
# 生成范围在[0, 4),步长为1,2行2列的2维数组
a = np.arange(4).reshape(2, 2)
print("*"*10+" a "+"*"*10)
print(a)
# 生成范围在[0, 4),步长为1,2行2列的2维数组
b = np.arange(4).reshape(2, 2)
print("*"*10+" b "+"*"*10)
print(b)
c = np.append(a, b)
print("*"*10+" 合并为一维数组c "+"*"*10)
print(c)
print("*"*10+" 合并后的数组维度 "+"*"*10)
print(c.shape)
c = np.append(a, b, axis=0)
print("*"*10+" axis=0,按行合并 "+"*"*10)
print(c)
print("*"*10+" 合并后的数组维度 "+"*"*10)
print(c.shape)
c = np.append(a, b, axis=1)
print("*"*10+" axis=1,按列合并 "+"*"*10)
print(c)
print("*"*10+" 合并后的数组维度 "+"*"*10)
print(c.shape)
运行结果:

np.concatenate()
np.concatenate():没有内存问题。沿指定 行或列 连接数组或矩阵。

import numpy as np
a = np.array([[1, 2], [3, 4]])
print("*"*10+" a "+"*"*10)
print(a)
b = np.array([[5, 6]])
print("*"*10+" b "+"*"*10)
print(b)
# 按行合并
c = np.concatenate((a, b)) # 合并的数组(数组个数可以大于2个)需要放到一个元组中
print("*"*10+" 按行合并:默认 "+"*"*10)
print(c)
c = np.concatenate((a, b), axis=0)
print("*"*10+" 按行合并:axis=0 "+"*"*10)
print(c)
print("*"*10+" 按列合并:axis=1 "+"*"*10)
c = np.concatenate((a, b.T), axis=1) # 按列合并时,数组的行数要相同。
print(c)
运行结果:

np.stack()
np.stack():沿着新的轴加入一系列数组
import numpy as np
a = np.array([[1, 2], [3, 4]])
print("*"*10+" a "+"*"*10)
print(a)
b = np.array([[5, 6], [7, 8]])
print("*"*10+" b "+"*"*10)
print(b)
c = np.stack((a, b))
print("*"*10+" 默认:按行堆叠数组 "+"*"*10)
print(c)
c = np.stack((a, b), axis=0)
print("*"*10+" axis=0:按行堆叠数组 "+"*"*10)
print(c)
c = np.stack((a, b), axis=-1)
print("*"*10+" axis=-1:按列堆叠数组 "+"*"*10)
print(c)
运行结果:

zip([iterable, ...])
zip([iterable, ...]):将对象中对应的元素打包成一个个元组构成的zip对象。
Python的内置函数,多用于张量运算。
import numpy as np
a = np.array([[1, 2], [3, 4]])
print("*"*10+" a "+"*"*10)
print(a)
b = np.array([[5, 6], [7, 8]])
print("*"*10+" b "+"*"*10)
print(b)
print("*"*10+" 元组c的地址 "+"*"*10)
c = zip(a, b) # 内置函数,不需要加np.
print(c) # 输出元组c的地址
print("*"*10+" 读出zip中的数据 "+"*"*10)
for i, j in c:
print(i, end=",")
print(j)
运行结果:

# 使用zip()函数组合两个向量
import numpy as np
a = [1, 2, 3]
print("*"*10+" a "+"*"*10)
print(a)
b = [4, 5, 6]
print("*"*10+" b "+"*"*10)
print(b)
print("*"*10+" 元组c的地址 "+"*"*10)
c = zip(a, b)
print(c) # 输出元组c的地址
print("*"*10+" 读出zip中的数据 "+"*"*10)
for m, n in c:
print(m, end=',')
print(n)
运行结果:

总结:
- append()、concatenate()以及stack()函数都有一个axis参数,用于控制数组合并是按行( axis = 0 )还是按列 ( axis = 1 ) 合并。
- append()和concatenate()函数中待合并的数组必须由相同的行数(按列合并)或相同的列数(按行合并)。
- stack()、hstack()、vstack()和dstack()函数中待合并的数组必须要具有相同的形状。
np.hstack():栈数组垂直顺序(行) hang/horizon
np.vstack():栈数组垂直排序(列) vertical
np.dstack():栈数组按顺序深入(沿第3维) deep
np.vsplit():将数组分解成垂直的多个子数组的列表。 vertical

好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客

