Python自带的numpy是深度学习最常用的库之一,作为深度学习入门,只需要掌握创建数组、索引、类型转换、维度变换即可。本文主要讲解数组。
1.1 数组的维度与形状
在NumPy中,数组是使用np.array
函数创建的,可以从列表或其他序列类型转换而来。数组可以是任意维度的,这由输入数据的形状决定。np.array
是NumPy库中用于创建数组的函数。NumPy数组(或ndarray
)是NumPy的核心特性之一,提供了高效的多维数组操作,支持数学和逻辑运算、形状操作、排序、选择、I/O操作、离散傅里叶变换、基本线性代数、基本统计操作以及随机模拟等。在科学计算和数据分析中,NumPy数组由于其速度和灵活性而被广泛使用。
要使用np.array
创建数组,你需要导入NumPy库,并将一个列表(或者嵌套列表)作为参数传递给np.array
。这可以创建出各种维度的数组:
import numpy as np
# 创建一维数组
arr1d = np.array([1, 2, 3])
# 创建二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
# 创建三维数组
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
x = np.array([[1, 2, 3]])创建了一个NumPy数组,由于数据被包含在两层方括号[[ ]]
内,这表明它是一个二维数组。
对于x = np.array([[1, 2, 3]])一个二维数组,其形状的计算基于方括号的嵌套层级以及每个层级内元素的数量。让我们一步一步来分析它的形状:
1. 最外层的方括号定义了数组的最外层,表示这是一个数组。因为这个数组内部还有另一层方括号,所以这是一个二维数组。
2. 内层的方括号[1, 2, 3]表示数组的第一个(也是唯一一个)"行"。这个行内有三个元素。
计算形状:
第一个维度(行数):由最外层方括号内的元素数量决定。这个例子中只有一个元素 `[1, 2, 3]`,所以第一个维度的大小是 `1`。
第二个维度(列数):由内层方括号内的元素数量决定。由于内层方括号 `[1, 2, 3]` 包含三个元素,所以第二个维度的大小是 `3`。
因此,数组 `x` 的形状是 `(1, 3)`,表示一个二维数组,其中有 1 行和 3 列。
使用 `.shape` 验证 : 在Python中,可以直接使用NumPy数组的 `.shape` 属性来获取数组的形状,无需手动计算:
print(x.shape)
这将输出 `(1, 3)`,证明 `x` 是一个形状为 `(1, 3)` 的二维数组。
1.2 使用 ones,empty, zeros生成数组,形参shape=[2,3]为2行3列的维度
#in:
np.ones(shape=[2,3]) #[2,3]为2行3列的维度
#out:
array([[1., 1., 1.],
[1., 1., 1.]])
#in:
np.zeros(shape=[3,4])
#out:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
#in:
np.empty(shape=[4,5]) #随机生成
#out:
array([[2.47053687e-316, 6.27463370e-322, 0.00000000e+000,
0.00000000e+000, 1.78019625e-306],
[5.30276956e+180, 3.31033942e-033, 4.57487963e-071,
3.25824571e-086, 3.35560119e-143],
[6.01433264e+175, 6.93885958e+218, 5.56218858e+180,
3.94356143e+180, 7.18978022e-067],
[2.90327285e-057, 2.08799593e-076, 6.82201766e-067,
7.49078798e-144, 1.50008929e+248]])
1.3 使用linspace,arange生成数组(注意区间闭合)
#in:
np.linspace(0,99,10) #左闭右闭,等距生成数组,前两个数为区间,第三个数是步长
#out:
array([ 0., 11., 22., 33., 44., 55., 66., 77., 88., 99.])
#in:
np.arange(0,99,33) #左闭右开,第三个数是步长
#out:
array([ 0, 33, 66])
#in:
np.random.normal(0, 1, size=(8,10)) #在(0,1)区间随机生成维度为[8,10]的数组
#out:
array([[ 0.4889333 , 0.52598919, -1.1787282 , 0.92947144, -0.61411273,
-0.40308503, -0.24170964, -1.65005546, -1.10860983, -1.17195597],
[ 2.30153196, 0.08231435, -0.42151829, 0.23084481, -0.22912885,
0.35418584, 0.18042856, 0.50218664, -0.06535679, -1.08141255],
[ 0.78668497, 0.40467269, -2.15751968, -0.5284904 , 0.61413254,
0.38134191, -0.32608761, -0.80535812, -0.28665986, -0.46265705],
[ 0.40831628, 1.1195378 , -0.19555259, -1.26725678, 0.06050092,
-1.53074358, -0.46109896, 1.0585371 , -1.68785747, -0.38269948],
[ 0.2533123 , 0.7493127 , -0.39330055, 0.59872789, 1.23311894,
1.56123508, 0.88216884, -0.11006012, 1.67101912, 0.36773784],
[-0.01196778, -0.29989697, -0.10620468, 0.62047068, -0.35919101,
0.14259044, -0.77929073, 1.07955841, -0.57254166, -0.75650875],
[-0.38727358, 0.34665637, 0.28927818, 0.23179733, 0.22165409,
0.3740697 , -0.03544985, 0.34657169, -0.21841557, 1.18743025],
[-0.88678905, -1.13712659, 0.38860167, -0.43039802, -0.23007068,
1.49646142, -0.60181792, 2.09735673, -1.08618737, -1.09159316]])
1.4 生成服从某种函数分布的数组(均匀分布,正态分布)
#in:
np.random.uniform(-1,1,100000) #均匀分布,前两个数是区间,第三个数是个数
#out:
array([ 0.15119225, 0.40014323, -0.05461068, ..., -0.98073734,
0.75843808, 0.4539914 ])
#in:
np.random.normal(1.8, 0.1, 100000) #参数分别是 对称轴,标准差,个数
#out:
array([1.64399767, 1.59405144, 1.92386876, ..., 1.85188776, 1.72408358,
1.82817792])