Numpy简介:Python科学计算基础包的核心功能与应用场景详解
一、Numpy简介

NumPy 是 Python 中用于科学计算的基础包。它是一个 Python 库。这个库提供了多维数组对象。还提供了各种派生对象,像掩码数组和矩阵等。并且提供了用于数组快速操作的各种 API。这些 API 涵盖了数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数、基本统计运算和随机模拟等方面。
NumPy 包的核心部分是 ndarray 对象。它把 python 原生的具有相同数据类型的 n 维数组进行了封装。为了确保其性能良好,许多操作都是先由代码在本地进行编译,然后再执行的。
numpy 数组在创建时大小是固定的。python 数组(list)具有动态性。如果要更改 ndarray 的大小,就会创建一个新的数组,同时删除原来的数组。
1. NumPy数组与Phthon List类型区别。
Python 的原生数组包含 NumPy 的对象时,这种情况允许不同大小元素的数组。
2. 安装
pip install numpy
二、ndarray基本知识
NumPy 的主要对象是同构多维数组。它是一个元素表,通常是数字,且所有元素类型相同。这个数组由非负整数元组来索引。在 NumPy 的维度中,这些维度被称为轴。
3D 空间里点的坐标[1, 2, 1]拥有一个轴。这个轴包含 3 个元素,故而我们称其长度为 3。在下面所展示的例子当中,数组有 2 个轴。其中第一轴的长度是 2,第二轴的长度是 3。
[[ 1., 0., 0.], [ 0., 1., 2.]]
NumPy 的数组类被称作 ndarray ,它还有一个别名叫做 array ,然而它和 Python 的 array 是不一样的。
1. ndarray的属性
ndarray 的 ndim 表示 NumPy 数组中 axes 的个数;ndarray 的 shape 表示数组的维度;ndarray 的 size 表示数组元素的个数;ndarray 的 dtype 表示元素的数据类型,为 object;ndarray 的 itemsize 表示数组中每个元素的字节大小,等同于 ndarray.dtype.itemsize,也就是数据类型的长度。
三、简单使用
1. 使用示例
import numpy as np 使用 np.arange(15) 创建一个包含 0 到 14 的一维数组,然后将其重塑为 3 行 5 列的二维数组,赋值给变量 a 。 print(a) ''' 结果 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] ''' 打印出 a 的形状、维度、数据类型名称、每个元素的大小以及元素的总数。a 的形状为(3, 5),维度为 2,数据类型名称为 int64,每个元素的大小为 8,元素的总数为 15。 print(type(a)) #b = np.array([6, 7, 8]) print(b) # [6 7 8] print(type(b)) #
2. 创建数组
从python元组或数组中创建
a = np.array(1,2,3,4) # WRONG a 是一个数组,其元素为[1,2,3,4] # RIGHT
将序列的序列转成二维数组
b 是一个数组,它由两个子数组组成,第一个子数组为 (1.5, 2, 3),第二个子数组为 (4, 5, 6) 。 >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]]) ### 创建NumPy数组时指定类型 创建了一个数组 c,该数组是通过 np.array 函数生成的,其元素为 [ [1,2], [3,4] ],并且数据类型被指定为 complex 。 ## 3. 创建特殊数组 ### 创建全0数组
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])
### 创建全1数组
创建一个形状为(2, 3, 4)的数组,数据类型为 np.int16 。 这个数组的维度是 3 维,第一维大小为 2 ,第二维大小为 3 ,第三维大小为 4 。 每个元素都是整数类型,占用 2 个字节的内存空间。 它可以用于各种数值计算和数据存储的场景。
array([[[ 1, 1, 1, 1],
[ 1, 1, 1, 1], [ 1, 1, 1, 1]], [[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]]], dtype=int16)
### 随便创建一个数组
np 生成一个形状为(2,3)的空数组,此数组未初始化,其输出结果可能会有所不同。
数组中包含三个元素,第一个元素的值为 3.73603959e-262,第二个元素的值为 6.02658058e-154,第三个元素的值为 6.55490914e-260。
[5.30498948 乘以 10 的-313 次方,3.14673309 乘以 10 的-307 次方,1.00000000 乘以 10 的 0 次方]
创建range数组(第3个参数是步长)
np.arange( 10, 30, 5 ) array([10, 15, 20, 25])
创建序列,第3个参数是元素个数
数组包含 0. 、0.25、0.5 、0.75、1. 、1.25、1.5 、1.75、2. 这些数值
四、基础操作
1. 元素按位 加 减 乘 除
import numpy as np np 生成了一个数组,数组中的元素分别为 20、30、40、50,该数组被赋值给变量 a b = np.arange(4) print(b) c = a - b print(c) print(b ** 2) print(10 * np.sin(a)) print(a < 20) A = np.array([[1, 1], [0, 1]])
输出:
[0 1 2 3] [20 29 38 47] [0 1 4 9] [9.12945251, -9.88031624, 7.4511316, -2.62374854] 分别是四个不同的数值,9.12945251 是其中之一,-9.88031624 是另一个,7.4511316 又是一个,-2.62374854 为最后一个。 [False False False False]
2. 矩阵乘法
* 按元素进行运算
import numpy as np a = np.array([20, 30, 40, 50]) b = np.arange(4) print(a*b) #[ 0 30 80 150]
矩阵乘积 @或.dot
import numpy as np a = np.array([20, 30, 40, 50]) b = np.arange(4) print(a@b) # 260 print(a.dot(b)) # 260
3. 聚合函数
import numpy as np b 是通过 np.arange(12)生成的数组,然后将其重塑为 3 行 4 列的形状。 ''' 输出 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' print(b) 打印(b 的总和,按轴 0 进行计算),结果为[12 15 18 21] 打印 b 沿轴 1 的最小值。结果为 [0 4 8]。
五、普通函数universal functions
按元素计算的普通函数:
sin 相关内容;cons 相关内容;exp 相关内容;all 相关内容;any 相关内容;apply_along_axis 相关内容;argmax 相关内容;argmin 相关内容;argsort 相关内容;average 相关内容;bincount 相关内容;ceil 相关内容;clip 相关内容;conj 相关内容;corrcoef 相关内容;cov 相关内容;cross 相关内容;cumprod 相关内容;cumsum 相关内容;diff 相关内容;dot 相关内容;floor 相关内容;inner 相关内容;INV 相关内容;lexsort 相关内容;max 相关内容;maximum 相关内容;mean 相关内容;median 相关内容;min 相关内容;minimum 相关内容;nonzero 相关内容;outer 相关内容;prod 相关内容;re 相关内容;round 相关内容;sort 相关内容;std 相关内容;sum 相关内容;trace 相关内容;transpose 相关内容;var 相关内容;vdot 相关内容;vectorize 相关内容;where 相关内容。
测试
numpy 对 a 进行操作,包含轴信息 axis 等,输出到 out ,保持维度 keepdims 等情况。
沿轴与操作(全非0就返回True)。
numpy 对数组 a 进行操作,在指定的轴 axis 上进行判断,结果存储在 out 中,是否保持维度 keepdims 由参数决定,只要数组 a 中存在一个元素满足条件,就返回 True,否则返回 False
沿轴或操作(有一个非0就返回True)。
numpy 沿着指定的轴 axis 对数组 arr 应用函数 func1d ,同时可以传递额外的参数 *args 和关键字参数 **kwargs 。
沿轴进行func1d操作。
numpy 对数组 a 进行操作,其中指定了轴 axis 为 None ,结果存储在 out 中,该操作是找出数组 a 中沿指定轴的最大值的索引
沿轴最大值的索引。
numpy.argmax(a, axis=None, out=None)
沿轴最小值的索引。
np.average
沿轴计算平均值。
numpy 执行 bincount 操作,参数为 x,还可以有可选参数 weights 以及 minlength 且其默认值为 0
遍历数组 x 。创建一个新的数组 y ,其长度为 x 中的最大值。对于 x 中的每一个元素,执行以下操作:如果是 y[x[i]] += 1 ;如果是 y[x[i]] += widht[i] 。
numpy.ceil
向上取整。
numpy 对 a 进行裁剪操作,将其限制在 a_min 和 a_max 之间,输出结果存储在 out 中,如果 out 未指定,则在原数组 a 上进行修改
把数组限制在指定的区间内
numpy 对 x 进行共轭操作,结果可以通过 out 指定输出位置,where 条件决定是否执行该操作,casting 用于指定类型转换规则,order 表示数组的内存布局,dtype 可指定输出数据类型,subok 决定返回的数组是否为子类类型,签名和外部对象用于特定的功能扩展。
返回共轭复数。
numpy 进行累积乘积操作,参数为 a,还可以指定轴 axis ,指定数据类型 dtype ,以及输出结果的数组 out 。
沿着轴把元素一个个相乘,并记录中间结果
numpy 对数组 a 进行累积求和操作,可指定轴 axis ,也可指定数据类型 dtype ,还可将结果输出到 out 数组中 。
沿着轴把元素一个个相加,并记录中间结果
numpy.diff(a, n=1, axis=-1)
对相邻的元素沿着轴做差,规则是:out[n]等于 a[n+1]减去 a[n]
numpy.inner(a,b)
内积
六、索引、切片、迭代
1. 一维数组
import numpy as np a = np.arange(10) ** 3 打印(a),其结果为[0, 1, 8, 27, 64, 125, 216, 343, 512, 729] print(a[2]) # 8 print(a[2:5]) # [ 8 27 64] a[:6:2] = -1000 a 的索引从 0 开始到 6 结束,每隔 2 个元素将其设置为 -1000,即 a[0] = -1000,a[2] = -1000,a[4] = -1000 这是一个包含多个数字的列表,分别为[-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729] 打印(a 的逆序)。[729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000]
2. 多维数组(重点)
import numpy as np def f(x, y): return 10 * x + y 使用函数 f 生成一个形状为(5, 4)的数组 b,数组的数据类型为整数 int print(b) ''' [[ 0 1 2 3] [10 11 12 13] [20 21 22 23] [30 31 32 33] [40 41 42 43]] ''' print(b[2, 3]) # 23 打印 b 的第 0 行到第 4 行以及第 1 列的元素,其结果为[1, 11, 21, 31, 41] 打印 b 数组的第二列,即 [ 1 11 21 31 41] print(b[1:3, :]) ''' [[10 11 12 13] [20 21 22 23]] ''' print(b[-1]) # [40 41 42 43] for row in b: print(row) ''' [0 1 2 3] [10 11 12 13] [20 21 22 23] [30 31 32 33] [40 41 42 43] '''
3. dots(...)
dots(...)表示许多个.
比如说 x 是一个5轴的数组,那么:
x[...,3] to x[:,:,:,:,3] and x[4,...,5,:] to x[4,:,:,5,:]
七、数组形状
vel() / reshape() / T
随机给定一个数组的形状
resize() 函数会改变原来数组的形状
八、不同数组的堆叠