首页 > 编程笔记 > Python笔记 阅读:3

NumPy创建数组详解(附带实例)

NumPy 创建简单的数组主要使用 array() 函数,语法格式如下:
numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
参数说明:
【实例】创建几个简单的数组,效果如下图所示:


图 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]

数组 n2 是数组 n1 的副本,从运行结果得知,虽然修改了数组 n2,但是数组 n1 没有发生变化。

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]]

这里,创建的数组元素为随机数,它们未被初始化。如果要改变数组中数据的类型,可以使用 dtype 参数,如通过 dtype=int 定义数据类型为整型。

创建指定维数并以 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)
参数说明:
下面使用 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)
参数说明:
【实例】创建马拉松赛前训练等差数列数组,程序代码如下:
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)
参数说明:
例如:
# 导入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]]

相关文章