一、Numpy简介
NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
NumPy包的核心是 ndarray 对象。它封装了python原生的同数据类型的 n 维数组,为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。
numpy数组创建时是固定大小,python数组(list)是动态的。更改ndarray的大小将创建一个新数组并删除原来的数组。
1. NumPy数组与Phthon List类型区别。
- NumPy数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。
- python的List可以存放不同类型的元素。
例外情况:Python的原生数组里包含了NumPy的对象的时候,这种情况下就允许不同大小元素的数组。
- 数学操作执行效率高于原生python
- 越来越多的基于Python的科学和数学软件包使用NumPy数组。
2. 安装
pip install numpy
二、ndarray基本知识
NumPy的主要对象是同构多维数组(homogeneous multidimensional array)。它是一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。在NumPy维度中称为 轴(axes)。
例如,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 a = np.arange(15).reshape(3, 5) print(a) ''' 结果 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] ''' print(a.shape, a.ndim, a.dtype.name, a.itemsize, a.size) # (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 = np.array([1,2,3,4]) # RIGHT
将序列的序列转成二维数组
b = np.array([(1.5,2,3), (4,5,6)]) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]]) ### 创建NumPy数组时指定类型 ```c = np.array( [ [1,2], [3,4] ], dtype=complex )``` ## 3. 创建特殊数组 ### 创建全0数组
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])
### 创建全1数组
np.ones( (2,3,4), dtype=np.int16 )
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.empty( (2,3) ) # uninitialized, output may vary
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
创建range数组(第3个参数是步长)
np.arange( 10, 30, 5 ) array([10, 15, 20, 25])
创建序列,第3个参数是元素个数
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
四、基础操作
1. 元素按位 加 减 乘 除
import numpy as np a = np.array([20, 30, 40, 50]) 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] [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).reshape(3, 4) ''' 输出 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' print(b) print(b.sum(axis=0)) # [12 15 18 21] print(b.min(axis=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.all(a, axis=None, out=None, keepdims=
沿轴与操作(全非0就返回True)。
numpy.any(a, axis=None, out=None, keepdims=
沿轴或操作(有一个非0就返回True)。
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)
沿轴进行func1d操作。
numpy.argmax(a, axis=None, out=None)
沿轴最大值的索引。
numpy.argmax(a, axis=None, out=None)
沿轴最小值的索引。
np.average
沿轴计算平均值。
numpy.bincount(x, weights=None, minlength=0)
遍历数组x, 创建新的数组y(长度是x中的最大值), 对于x中的每一个元素,执行y[x[i]] += 1 或 y[x[i]] += widht[i]
numpy.ceil
向上取整。
numpy.clip(a, a_min, a_max, out=None)
把数组限制在指定的区间内
numpy.conj(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) =
返回共轭复数。
numpy.cumprod(a, axis=None, dtype=None, out=None)
沿着轴把元素一个个相乘,并记录中间结果
numpy.cumsum(a, axis=None, dtype=None, out=None)
沿着轴把元素一个个相加,并记录中间结果
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 print(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; 从0到6 每2个设置为-1000 print(a) # [-1000 1 -1000 27 -1000 125 216 343 512 729] print(a[::-1]) # 倒序 [ 729 512 343 216 125 -1000 27 -1000 1 -1000]
2. 多维数组(重点)
import numpy as np def f(x, y): return 10 * x + y b = np.fromfunction(f, (5, 4), dtype=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 print(b[0:5, 1]) # [ 1 11 21 31 41] print(b[:, 1]) # [ 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[1,2,...] is equivalent to x[1,2,:,:,:], x[...,3] to x[:,:,:,:,3] and x[4,...,5,:] to x[4,:,:,5,:]
七、数组形状
vel() / reshape() / T
随机给定一个数组的形状
resize() 函数会改变原来数组的形状
八、不同数组的堆叠
- np.vstack((a,b))
- np.hstack((a,b))
- np.column_stack((a,b))
- r_
- c_