NumPy个人学习笔记【未完待续】
目录
基础知识
NumPy的主要对象是同类型的多维数组。在NumPy中,维度称为轴。轴的数目为rank。
它是一张表,所有元素(通常是数字)的类型都相同,并通过正整数元组索引。
NumPy的数组类被称为ndarray。别名为 array
。
ndarray.ndim:数组的轴(维度)的个数。
ndarray.shape:数组的维度。
ndarray.size:数组元素的总数。
ndarray.dtype:一个描述数组中元素类型的对象。
ndarray.itemsize:数组中每个元素的字节大小。
ndarray.data:该缓冲区包含数组的实际元素。
数组的创建
一个常见的错误在于使用多个数值参数调用 array
函数,而不是提供一个数字列表(List)作为参数。
array
将序列的序列转换成二维数组,将序列的序列的序列转换成三维数组,等等。
函数 zeros
创建一个由0组成的数组,函数 ones
创建一个由1数组的数组,函数 empty
内容是随机的并且取决于存储器的状态。默认情况下,创建的数组的dtype是 float64
。
要创建数字序列,NumPy提供了一个arange
的函数,该函数返回数组而不是列表。
当 arange
与浮点参数一起使用时,由于浮点数的精度是有限的,通常不可能预测获得的元素数量。出于这个原因,通常最好使用函数 linspace
,它接收我们想要的元素数量而不是把长作为参数。
例:
np.linspace(0,2,9)
#9个从0到2的数字
打印数组
-
最后一个轴从左到右打印,
-
倒数第二个从上到下打印,
-
其余的也从上到下打印,每个切片与下一个用空行分开。
一维数组被打印为行、二维为矩阵和三维为矩阵列表。
如果数组太大而无法打印,NumPy将自动跳过数组的中心部分并仅打印角点...
要禁用此行为并强制NumPy打印整个数组,你可以使用 set_printoptions
更改打印选项。
例:
np.set_printoptions(threshold=np.nan)
基本操作
与许多矩阵语言不同,乘法运算符 *
的运算在NumPy数组中是元素级别的。矩阵乘积可以使用 dot
函数或方法执行
某些操作(例如+=和*=)适用于修改现有数组,而不是创建新数组。
当使用不同类型的数组操作时,结果数组的类型对应于更一般或更精确的数组(称为向上转换的行为)。
通过指定 axis
参数,你可以沿着数组的指定轴应用操作
axis=0 对列操作 axis=1对行操作
通用函数
NumPy提供了常见的数学函数,如sin,cos和exp。In NumPy, these are called “universal functions”( ufunc
). 在NumPy中,这些函数在数组上按元素级别操作,产生一个数组作为输出。
NumPy提供了常见的数学函数,如sin,cos和exp。
在NumPy中,这些函数在数组上按元素级别操作,产生一个数组作为输出。
索引、切片和迭代
一维数组可以被索引,切片和迭代。
多维数组每个轴可以有一个索引。
当提供比轴数更少的索引时,缺失的索引被认为是一个完整切片
例:
b
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
b[-1] # 相当于b[-1,:]
array([40, 41, 42, 43])
三个点( ...
)表示产生完整索引元组所需的冒号。例如,如果 x
是rank为的5数组(即,它具有5个轴),则
x[1,2,...]
等于x[1,2,:,:,:]
。
x[...,3]
等效于x[:,:,:,:,3]
。
x[4,...,5,:]
等效于x[4,:,:,5,:]
。
迭代 多维数组是相对于第一个轴完成的。
如果想要对数组中的每个元素执行操作,可以使用 flat
属性,该属性是数组中所有元素的迭代器。
形状操作
更改数组的形状
修改数组形状的命令:
a.ravel() #返回数组,变成一行
a.reshape(x,y) #返回一个x*y型的数组
a.T #返回转置数组
ndarray.resize
方法修改数组本身
将不同数组堆叠在一起
np.vstack((a,b)) #垂直堆叠
np.hstack((a,b)) #水平堆叠
函数 column_stack
将1D数组作为列叠加到2D数组中。
对于任何输入数组,函数 row_stack
相当于 vstack
。一般来说,对于具有两个以上维度的数组,hstack
沿第二轴堆叠,vstack
沿第一轴堆叠,concatenate
允许一个可选参数,给出串接应该发生的轴。
r_
和 c_
可用于通过沿一个轴叠加数字来创建数组。它们允许使用范围字面量(“:”)
将一个数组分成几个较小的数组
使用 hsplit
,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列
np.hsplit(a,3) # 把a分成三组
np.hsplit(a,(3,4)) # 把a从第3,4列开始拆分
复制和视图
完全不复制
简单赋值
函数调用
视图或浅复制
不同的数组对象可以共享相同的数据。 view
方法创建一个新的数组对象,它查看相同的数据。
对数组切片返回一个视图:
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = 10 # s[:] is a view of s. Note the difference between s=10 and s[:]=10
>>> a
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
深拷贝
copy
方法生成数组及其数据的完整拷贝。
函数和方法概述
-
数组创建
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r, zeros, zeros_like
-
转换
ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat
-
手法
array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
-
问题
all, any, nonzero, where
-
顺序
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
-
操作
choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum
-
基本统计
cov, mean, std, var
-
基本线性代数
cross, dot, outer, linalg.svd, vdot
Less基础
广播规则
让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐 输出数组的shape是输入数组shape的各个轴上的最大值
如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错,当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值
索引技巧
除了通过整数和切片进行索引之外,还可以使用整数数组和布尔数组进行索引。
当被索引的数组 a
是一个多维数组,单个索引数组指的是 a
的第一个维度。
当我们用(整数)索引数组索引数组时,我们提供了要选择的索引列表。使用布尔值作为索引时,方法是不同的;我们明确地选择数组中的哪些元素我们想要的,哪些不是。
>>> a = np.arange(12).reshape(3,4)
>>> b = a > 4
>>> b
array([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]])
>>> a[b]
array([ 5, 6, 7, 8, 9, 10, 11])
>>> a[b] = 0
>>> a
array([[0, 1, 2, 3],
[4, 0, 0, 0],
[0, 0, 0, 0]])