数组

编辑

NumPy数组类似于Python列表。它们都可以用作容器,具有获取(getting)和设置(setting)元素以及插入和移除元素的功能。Python列表用树实现。Numpy数组用C语言数组实现,更紧凑,尤其是在一维以上的维度;向量化操作时比Python列表快,但在末尾添加元素比Python列表慢。

用法

编辑

NumPy数组类似于Python列表用法略有区别:

a=[1,2,3]
b=[4,5,6]
[q*2 for q in a]
[q+r for q,r in zip(a,b)]

a=np.array([1,2,3])
b=np.array([4,5,6])
a*2
a+b

数组生成

编辑

NumPy数组无法像Python列表那样加长,因为在数组末尾没有保留空间。因此,常见的做法是定义一个Python列表,对它进行操作,然后再转换为NumPy数组,或者用np.zeros和np.empty初始化数组,预分配必要的空间。

a=np.array([1,2,3])
b=np.zeros(3,int)
c=np.ones(3,int)
d=np.empty(3)
e=np.full(3,7)
f=np.zeros_like(a)
g=np.ones_like(a)
h=np.empty_like(a)

i=np.arange(2,9,2) #Out: array([2, 4, 6, 8]);  arange means Array Range
np.linspace(2.0, 3.0, num=5)# output:  array([2.  , 2.25, 2.5 , 2.75, 3.  ])

np.random.randint(0,10,3) # uniform in [0,10). Caution: random.randint is in [0,10]
np.random.uniform(1, 10,3)
np.random.randn(3) # standard normal distribution
np.random.normal(5,2,3) #normal, mu=5, sigma=2

数组访问

编辑

数组的索引基于0.

索引为-1的元素为数组首元素的左侧元素,即数组尾元素。因此,a[-2:]即数组的尾部两个元素。

索引范围可用 begin:end 形式或者 begin:end:step形式,其中的begin、end都可以省略采用缺省值

索引也可以表示为一个list,如a1,3,4表示取数组a的第2、4、5号元素。

数组的赋值,如b=a, c=a[:]都是原数组的view,只有 d=a.copy()才是复制一份。

也可以用布尔索引。例如 a[a>5]

np.ndenumerate类构造了数组的迭代器。每次迭代返回索引与值的组合。

获取满足条件的数组元素的索引,可用用np.where()函数或等效的np.nonzero()函数。为了获取满足条件的多维数组元素的索引,可用np.transpose(np.nonzero(x>1))或等效的np.where(x>1)

np.where()函数的更高级用法,使用三个参数condition、x、y,表示如果条件满足,就取array_like的x的对应元素替换,否则取y的对应元素替换。

np.clip()函数对一个数组给定一个interval如[a,b],数组中值小于a的元素被赋值为a,值大于b的元素被赋值为b。

数组的运算

编辑

数组可以与标量运算,也可以与另一个数组运算。

和Python中一样,a//b表示div b(整除),x**n表示xⁿ

向量的点积可以用np.dot()函数,也可以用运算符@, 如 a@b

向量的叉积可以用np.cross()函数

数组的成员函数可以做的运算:max、min、argmax、argmin、sum、var、mean、std、sort(原地排序)、

np.searchsorted()函数对已排序数组搜索一个值的第一次出现的索引。

浮点数比较,使用np.allclose()函数。可以指定相对公差参数rtol或绝对公差参数atol。

多维数组

编辑

与一维数组相比,多维数组的新概念如下。

eyes()用于生成单位阵。

NumPy引入了axis的概念。对第i个轴,如x.sum(axis=1),表示保持其他索引,对第i个索引的遍历求累计值。

多维数组的运算符,除了@是矩阵乘法,其他均为element-wise。二维操作运算中,行向量和列向量被不同地对待。默认情况下,一维数组在二维操作中被视为行向量。因此,行向量的shape,是(n,)即(1,n)。

矩阵的转置,如x.T

一维数组生成二位数组可以使用reshape函数或newaxis建立新索引,都是原数组的view。例如a是一维数组,a.reshape(-1,1)等效于a[:,None],相当于行向量变为列向量。其中-1表示reshape自动计算该维度上的长度;方括号中的None充当np.newaxis的快捷方式,即在指定位置添加了一个空axis。

因此,NumPy中总共有三种类型的向量:一维数组,二维行向量和二维列向量。后二者转化为一维数组,可以用成员函数flatten()或reshape(-1)。根据规则,一维数组被隐式解释为二维行向量,因此通常不必在这两个数组之间进行转换,但一维数组的转置T操作结果还是原数组。

矩阵的堆叠或叫做连接,使用np.hstack与np.vstack()。矩阵与一维数字的水平堆叠,也可以用np.column_stack()。np.append()也可以对行或列追加。堆叠的逆操作是分裂:np.hsplit()与np.vsplit

矩阵可以通过两种方式完成复制:tile类似于分块矩阵的复制粘贴,repeat类似于逐行或逐列的复制。

特定的列和行可以用np.delete()删除。逆运算为np.insert()函数