NumPy基础知识-新手笔记

奋斗吧
奋斗吧
擅长邻域:未填写

标签: NumPy基础知识-新手笔记 Python博客 51CTO博客

2023-07-14 18:24:15 152浏览

NumPy基础知识-新手笔记,数组变形不同模型接收的输入格式不一样,我们需要将数据处理成符合模型要求的格式。修改数组的形状arr.reshape()arr.reshape():重新对向量arr维度进行改变,不修改向量本身#reshape函数importnumpyasnp#生成范围在[0,10),步长为1的整数arr=np.arange(10)print("*"*10+"arr"+"*"*10)p

数组变形

不同模型接收的输入格式不一样,我们需要将数据处理成符合模型要求的格式。

修改数组的形状

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)

运行结果:

NumPy基础知识-新手笔记_数组

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)

运行结果:

NumPy基础知识-新手笔记_数组_02

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)

运行结果:

NumPy基础知识-新手笔记_数组_03

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)

运行结果:

NumPy基础知识-新手笔记_数组_04

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

运行结果:

NumPy基础知识-新手笔记_多维数组_05

arr.squeeze()

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

NumPy基础知识-新手笔记_多维数组_06

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

运行结果:

NumPy基础知识-新手笔记_数组_07

arr.transpose()

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

NumPy基础知识-新手笔记_多维数组_08

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

运行结果:

NumPy基础知识-新手笔记_数组_09

合并数组

np.append()

np.append():内存占用大。


NumPy基础知识-新手笔记_多维数组_10

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

运行结果:

NumPy基础知识-新手笔记_数组_11

# 合并多维数组

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)

运行结果:

NumPy基础知识-新手笔记_数组_12

np.concatenate()

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


NumPy基础知识-新手笔记_元组_13

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)

运行结果:

NumPy基础知识-新手笔记_元组_14

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)

运行结果:

NumPy基础知识-新手笔记_元组_15

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)

运行结果:

NumPy基础知识-新手笔记_元组_16

# 使用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)

运行结果:

NumPy基础知识-新手笔记_数组_17

总结:

  1. append()、concatenate()以及stack()函数都有一个axis参数,用于控制数组合并是按 axis = 0 )还是按( axis = 1 ) 合并。
  2. append()和concatenate()函数中待合并的数组必须由相同的行数(按合并)或相同的列数(按合并)。
  3. stack()、hstack()、vstack()和dstack()函数中待合并的数组必须要具有相同的形状

np.hstack():栈数组垂直顺序()    hang/horizon

np.vstack():栈数组垂直排序()    vertical

np.dstack():栈数组按顺序入(沿第3维)   deep

np.vsplit():将数组分解垂直的多个子数组的列表。 vertical

NumPy基础知识-新手笔记_数组_18














好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695