NumPy创建数组详解(附带实例)
NumPy 创建简单的数组主要使用 array() 函数,语法格式如下:
【实例】创建几个简单的数组,效果如下图所示:

图 1 简单数组
程序代码如下:
NumPy 支持的数据类型比 Python 更多,通过 dtype 参数可以指定数组的数据类型,程序代码如下:
【实例】由于 ndmin=3,因此虽然给出的数组是一维的,但会创建一个三维数组,程序代码如下:
创建指定维数并以 0 填充的数组,主要使用 zeros() 函数,程序代码如下:
创建指定维数并以 1 填充的数组,主要使用 ones() 函数,程序代码如下:
创建指定维数和数据类型的数组并以指定值填充,主要使用 full() 函数,程序代码如下:
arange() 函数的语法格式如下:
下面使用 arange() 函数按照数值范围创建数组,程序代码如下:
与 arange() 函数不同,arange() 函数是从起始值到终止值的左闭右开区间(即包括起始值不包括终止值),第三个参数(如果存在)是步长;而 linespace() 函数是从起始值到终止值的闭区间(可以通过设置参数 endpoint=False,使终止值不包含在内),并且第三个参数表示值的个数。
linspace() 函数的语法格式如下:
【实例】创建马拉松赛前训练等差数列数组,程序代码如下:
例如:
要想解决这一问题,需要指定数据类型为 uint64(无符号整数,数据范围为 0~18446744073709551615),主要代码如下:
numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)参数说明:
- object:任何具有数组接口方法的对象。
- dtype:数据类型。
- copy:布尔值,可选参数,默认值为 True,表示 object 对象被复制,生成副本;否则,只有当 _array_ 返回副本,object 参数为嵌套序列,或者需要副本满足数据类型和顺序要求时,才会生成副本。
- order:元素在内存中的出现顺序,值为 K、A、C、F。如果 object 参数不是数组,则新创建的数组将按行排列(C);如果值为 F,则按列排列;如果 object 参数是一个数组,则顺序规则为 C(按行排列)、F(按列排列)、A(保持原顺序)、K(遵循元素在内存中的出现顺序)。
- subok:布尔值,如果值为 True,则传递子类,否则返回的数组为基类数组(默认值)。
- ndmin:指定生成数组的最小维数。
【实例】创建几个简单的数组,效果如下图所示:

图 1 简单数组
程序代码如下:
import numpy as np # 导入numpy模块 nl = np.array([1,2,3]) # 创建一个简单的一维数组 n2 = np.array([0.1,0.2,0.3])# 创建一个包含小数的一维数组 n3 = np.array([[1,2],[3,4]])# 创建一个简单的二维数组
NumPy 支持的数据类型比 Python 更多,通过 dtype 参数可以指定数组的数据类型,程序代码如下:
import numpy as np # 导入numpy模块 list = [1, 2, 3] # 列表 # 创建浮点型数组 nl = np.array(list, dtype=np.float_) # 或者 # nl = np.array(list, dtype=float) print(nl) print(nl.dtype) print(type(nl[0]))运行程序,结果如下:
[1. 2. 3.]
float64
<class 'numpy.float64'>
NumPy数组的复制
当运算和处理数组时,为了不影响原数组,可以对原数组进行复制,对复制后的数组进行修改、删除等操作。数组的复制可以通过 copy 参数实现,程序代码如下:import numpy as np # 导入numpy模块 nl = np.array([1,2,3]) # 创建数组 n2 = np.array(nl, copy=True) # 复制数组 n2[0] = 3 # 修改数组中的第一个元素为3 n2[2] = 1 # 修改数组中的第三个元素为1 print(nl) print(n2)运行程序,结果如下:
[1 2 3]
[3 2 1]
NumPy通过ndmin参数控制最小维数
数组可分为一维数组、二维数组和多维数组,通过 ndmin 参数可以控制数组的最小维数。无论给出的数组的维数是多少,ndmin 参数都会根据最小维数创建指定维数的数组。【实例】由于 ndmin=3,因此虽然给出的数组是一维的,但会创建一个三维数组,程序代码如下:
import numpy as np nd1 = [1, 2, 3] nd2 = np.array(nd1, ndmin=3) # 三维数组 print(nd2)运行程序,结果如下:
[[[1 2 3]]]
NumPy不同方式创建数组
创建指定维数和数据类型未初始化的数组主要使用 empty() 函数,程序代码如下:import numpy as np n = np.empty([2, 3]) print(n)运行程序,结果如下:
[[2.22519099e-307 2.33647355e-307 1.23077925e-312]
[2.33645827e-307 2.67023123e-307 1.69117157e-306]]
创建指定维数并以 0 填充的数组,主要使用 zeros() 函数,程序代码如下:
import numpy as np n = np.zeros(3) print(n)运行程序,结果为:
[0. 0. 0.]
输出结果默认是浮点型(float)的。创建指定维数并以 1 填充的数组,主要使用 ones() 函数,程序代码如下:
import numpy as np n = np.ones(3) print(n)运行程序,结果为:
[1. 1. 1.]
创建指定维数和数据类型的数组并以指定值填充,主要使用 full() 函数,程序代码如下:
import numpy as np n = np.full(shape=(3, 3), fill_value=8) print(n)运行程序,结果如下:
[[8 8 8]
[8 8 8]
[8 8 8]]
NumPy按照数值范围创建数组
1) 通过arange()函数创建数组
arange() 函数与 Python 内置的 range() 函数相似,区别在于返回值不同,arange() 函数的返回值是数组,而 range() 函数的返回值是列表。arange() 函数的语法格式如下:
arange([start,] stop[, step,], dtype=None)参数说明:
- start:起始值,默认值为 0。
- stop:终止值(不包含该值)。
- step:步长,默认值为 1。
- dtype:创建数组的数据类型,如果不设置数据类型,则使用输入数据的数据类型。
下面使用 arange() 函数按照数值范围创建数组,程序代码如下:
import numpy as np n = np.arange(1, 12, 2) print(n)运行程序,结果为:
[1 3 5 7 9 11]
2) 使用linspace()函数创建等差数列
在 Python 中创建等差数列可以使用 NumPy 的 linspace() 函数,该函数用于创建一个一维的等差数列数组。与 arange() 函数不同,arange() 函数是从起始值到终止值的左闭右开区间(即包括起始值不包括终止值),第三个参数(如果存在)是步长;而 linespace() 函数是从起始值到终止值的闭区间(可以通过设置参数 endpoint=False,使终止值不包含在内),并且第三个参数表示值的个数。
linspace() 函数的语法格式如下:
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)参数说明:
- start:数列的起始值;
- stop:数列的终止值;
- num:要生成的等步长的样本数量,默认值为 50;
- endpoint:如果值为 Ture,数列中包含 stop 参数的值,反之则不包含,默认值为 True;
- retstep:如果值为 True,则生成的数列中会显示间距,反之则不显示;
- dtype:数列的数据类型。
【实例】创建马拉松赛前训练等差数列数组,程序代码如下:
import numpy as np n1 = np.linspace(start=7500, stop=10000, num=6) n2 = np.linspace(start=7500, stop=10000, num=6, endpoint=False) print(n1) print(n2)运行程序,结果如下:
[7500. 8000. 8500. 9000. 9500. 10000.]
[7500. 7916.66666667 8333.33333333 8750. 9166.66666667 9583.33333333]
3) 使用logspace()函数创建等比数列
在 Python 中创建等比数列可以使用 NumPy 的 logspace() 函数,语法格式如下:numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)参数说明:
- start:数列的起始值;
- stop:数列的终止值;
- num:要生成的等步长的数据样本数量,默认值为 50;
- endpoint:如果值为 Ture,则数列中包含 stop 参数值,反之则不包含,默认值为 True;
- base:对数 log 的底数;
- dtype:数列的数据类型。
例如:
# 导入numpy模块 import numpy as np # 输出时打印不换行 np.set_printoptions(linewidth=800) # logspace()函数创建等比数列 n = np.logspace(start=0, stop=63, num=64, base=2, dtype='int') # 数组重塑8x8矩阵 print(n.reshape(8, 8))运行程序,结果如下:
[[ 1 2 4 8 16 32 64 128] [ 256 512 1024 2048 4096 8192 16384 32768] [ 65536 131072 262144 524288 1048576 2097152 4194304 8388608] [ 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648] [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648] [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648] [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648] [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648]]在上述示例中,出现了一个问题:后面出现负数,而且都是一样的。这是由于程序中指定的数据类型是 int,是 32 位的,数据范围是 -2147483648~2147483647,而我们计算后的数据远远超出了这个范围,便出现了溢出现象。
要想解决这一问题,需要指定数据类型为 uint64(无符号整数,数据范围为 0~18446744073709551615),主要代码如下:
n = np.logspace(start=0, stop=63, num=64, base=2, dtype='uint64')运行程序,结果为:
[[ 1 2 4 8 16 32 64 128] [ 256 512 1024 2048 4096 8192 16384 32768] [ 65536 131072 262144 524288 1048576 2097152 4194304 8388608] [ 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 2147483648] [ 4294967296 8589934592 17179869184 34359738368 68719476736 137438953472 274877906944 549755813888] [ 1099511627776 2199023255552 4398046511104 8796093022208 17592186044416 35184372088832 70368744177664 140737488355328] [ 281474976710656 562949953421312 1125899906842624 2251799813685248 4503599627370496 9007199254740992 18014398509481984 36028797018963968] [72057594037927936 144115188075855872 288230376151711744 576460752303423488 1152921504606846976 2305843009213693952 4611686018427387904 9223372036854775808]]