1. 从已有数据中创建数组
a. 将列表转换成 ndarray:
import numpy as np ls1 = [10, 42, 0, -17, 30] nd1 =np.array(ls1) print(nd1) print(type(nd1))
运行结果:
[ 10 42 0 -17 30] <class 'numpy.ndarray'>
b.嵌套列表可以转换成多维 ndarray:
import numpy as np ls2 = [[8, -2, 0, 34, 7], [6, 7, 8, 9, 10]] nd2 =np.array(ls2) print(nd2) print(type(nd2))
运行结果:
[[ 8 -2 0 34 7] [ 6 7 8 9 10]] <class 'numpy.ndarray'>
2. 利用 random 模块生成数组
几种 np.random 模块中常用的方法,如下表所示。
下面来看一些使用:
import numpy as np import random nd3 =np.random.random([4, 3]) #生成4行3列的数组 print(nd3) print("nd3的形状为:",nd3.shape)
执行结果:
[[0.59115057 0.52022516 0.05992361] [0.5077815 0.81313999 0.70061259] [0.24654561 0.11705634 0.71399966] [0.73964407 0.57138345 0.89284498]] nd3的形状为: (4, 3)
为了每次生成同一份数据,可以指定一个随机种子,使用 shuffle() 函数打乱生成的随机数。
import numpy as np np.random.seed(123) nd4 = np.random.randn(4, 3) print(nd4) np.random.shuffle(nd4) print("随机打乱后数据:") print(nd4) print(type(nd4))
执行结果:
[[-1.0856306 0.99734545 0.2829785 ] [-1.50629471 -0.57860025 1.65143654] [-2.42667924 -0.42891263 1.26593626] [-0.8667404 -0.67888615 -0.09470897]] 随机打乱后数据: [[-1.50629471 -0.57860025 1.65143654] [-2.42667924 -0.42891263 1.26593626] [-0.8667404 -0.67888615 -0.09470897] [-1.0856306 0.99734545 0.2829785 ]] <class 'numpy.ndarray'>
3. 创建特定形状的多维数组
参数初始化时,有时需要生成一些特殊矩阵,如全是 0 或 1 的数组或矩阵,这时我们可以利用 np.zeros、np.ones、np.diag 来实现,如下表所示。
下面通过几个示例说明:
import numpy as np # 生成全是 0 的 3x3 矩阵 nd5 =np.zeros([3, 3]) # 生成全是 1 的 3x3 矩阵 nd6 = np.ones([3, 3]) # 生成 4 阶的单位矩阵 nd7 = np.eye(4) # 生成 4 阶对角矩阵 nd8 = np.diag([1, 8, 3, 10]) print("nd5 =\n", nd5) print("nd6 =\n", nd6) print("nd7 =\n", nd7) print("nd8 =\n", nd8)
运行结果:
nd5 = [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] nd6 = [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] nd7 = [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]] nd8 = [[ 1 0 0 0] [ 0 8 0 0] [ 0 0 3 0] [ 0 0 0 10]]
有时还可能需要把生成的数据暂时保存到文件中,以备后续使用。
import numpy as np nd9 =np.random.random([3, 5]) np.savetxt(X=nd9, fname='./data.txt') nd10 = np.loadtxt('./data.txt') print(nd10)
运行结果:
[[0.1744383 0.15515217 0.74885812 0.57633094 0.06300636] [0.24340527 0.65213913 0.07284238 0.52232677 0.58538849] [0.83611286 0.76508018 0.26018483 0.20485587 0.95476232]]
打开当前目录下的 data.txt 也可以看到格式化的数据。
4. 利用 arange() 和 linspace() 函数生成数组
arange() 是 numpy 模块中的函数,其格式为:
arange([start,] stop[,step,], dtype=None)
其中,start 与 stop 用来指定范围,step 用来设定步长。在生成一个 ndarray 时,start 默认为0,步长 step 可为小数。Python 有个内置函数 range,其功能与此类似。
import numpy as np print(np.arange(10)) print(np.arange(0, 10)) print(np.arange(1, 4, 0.5)) print(np.arange(9, -1, -1))
运行结果:
[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] [1. 1.5 2. 2.5 3. 3.5] [9 8 7 6 5 4 3 2 1 0]
linspace() 也是 numpy 模块中常用的函数,其格式为:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
linspace() 可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中 endpoint(包含终点)默认为 True,等分数量 num 默认为 50。如果将 retstep 设置为True,则会返回一个带步长的 ndarray。
import numpy as np print(np.linspace(0, 1, 10))
运行结果:
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 0.66666667 0.77777778 0.88888889 1. ]
<2>. numpy中数组元素的获取
在 NumPy 中,既可以获取 ndarray 数组的单个元素,也可以获取一组元素(也即切片),这与 Python 中的列表(list)和元组(tuple)非常类似。
import numpy as np np.random.seed(2019) nd1 = np.random.random([10]) # 获取指定位置的数据, 获取第4个元素 nd1[3] #截取一段数据 nd1[3:6] # 截取固定间隔数据 nd1[1:6:2] # 倒序取数 nd1[::-2] # 截取一个多维数组的一个区域内数据 nd2=np.arange(25).reshape([5,5]) nd2[1:3,1:3] # 截取一个多维数组中, 数值在一个值域之内的数据 nd2[(nd2>3)&(nd2<10)] # 截取多维数组中, 指定的行,如读取第2,3行 nd2[[1,2]] #或nd12[1:3,:] # 截取多维数组中, 指定的列,如读取第2,3列 nd2[:,1:3]
获取数组中的部分元素除了通过指定索引标签来实现外,还可以通过使用一些函数来实现,如通过random.choice函数从指定的样本中随机抽取数据。