在numpy中,有一系列对数组进行操作的函数,在使用这些函数之前,必须先了解以下两个基本概念副本
视图
副本是一个数组的完整拷贝,就是说,先对原始数据进行拷贝,生成一个新的数组,新的数组和原始数组是独立的,对副本的操作并不会影响到原始数组;视图是一个数组的引用,对引用进行操作,也就是对原始数据进行操作,所以修改视图会对应的修改原始数组。 在使用函数和方法时,我们首先要明确其操作的是原始数组的副本还是视图,然后根据需要来做选择。一个基本的例子如下 >>> import numpy as np >>> a = np.arange(12) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> a.reshape(3,4) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> >>> a.resize(3,4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) reshape和resize方法都可以改变数组的形状,其中reshape操作的是副本,操作之后,原始数组的形状并没有改变,resize操作的是视图, 操作之后原始数组的形状发生了变化。一开始已经介绍了reshape和resize方法,可以修改数组的维度和形状,除此之外,ravel和flatten则可以将多维数组转换为一维数组,用法如下 >>> a = np.arange(12).reshape(3, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> a.ravel(order = 'C') array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> a.ravel(order = 'F') array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11]) >>> a.flatten(order = 'C') array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> a.flatten(order = 'F') array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11]) 数组转置是最高频的操作,在numpy中,有以下几种实现方式 >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
>>> a.T array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])
>>> a.transpose() array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])
>>> a.swapaxes(0, 1) array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])
>>> np.rollaxis(a, 1, 0) array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]]) 将多个维度相同的数组连接为一个数组,实现方式有以下几种 >>> a = np.arange(9).reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> b = np.arange(3) >>> b array([0, 1, 2])
# 以行进行合并 >>> np.concatenate((a, b.reshape(1, -1)), axis = 0) array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 1, 2]])
>>> np.append(a, b.reshape(1,-1), axis = 0) array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 1, 2]])
>>> np.vstack((a,b.reshape(1,-1))) array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 1, 2]]) # 以列进行合并 >>> np.concatenate((a, b.reshape(-1, 1)), axis = 1) array([[0, 1, 2, 0], [3, 4, 5, 1], [6, 7, 8, 2]])
>>> np.append(a, b.reshape(-1,1), axis = 1) array([[0, 1, 2, 0], [3, 4, 5, 1], [6, 7, 8, 2]])
>>> np.hstack((a,b.reshape(-1,1))) array([[0, 1, 2, 0], [3, 4, 5, 1], [6, 7, 8, 2]]) 数组的连接要求输入的数组必须为相同维度,而且在对应的轴上尺寸相同,特别需要注意,即使只是在二维数组的基础上增加1行或者1列,也要将添加项调整为二维数组。 这里的增加和删除指的是在指定轴的索引上进行操作,用法如下 >>> a = np.arange(9).reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> b = np.arange(3) >>> b array([0, 1, 2]) # 在第二行插入新数组 >>> np.insert(a, 1, b, axis=0) array([[0, 1, 2], [0, 1, 2], [3, 4, 5], [6, 7, 8]]) # 在第二列插入新数组 >>> np.insert(a, 1, b, axis=1) array([[0, 0, 1, 2], [3, 1, 4, 5], [6, 2, 7, 8]]) # 删除第二行 >>> np.delete(a, 1, axis = 0) array([[0, 1, 2], [6, 7, 8]]) # 删除第二列 >>> np.delete(a, 1, axis = 1) array([[0, 2], [3, 5], [6, 8]]) 5. 集合操作 >>> a = np.array([0, 1, 2, 3]) >>> b = np.array([2, 3, 4, 5]) # 取交集 >>> np.intersect1d(a, b) array([2, 3]) # 取a中的差集 >>> np.setdiff1d(a, b) array([0, 1]) # 取b中的差集 >>> np.setdiff1d(b, a) array([4, 5]) # 取a和b中差集的合集 >>> np.setxor1d(a, b) array([0, 1, 4, 5]) # 取a和b的合集 >>> np.union1d(a, b) array([0, 1, 2, 3, 4, 5]) 6. 数组的排序,去重 # 获取唯一的元素 >>> a = np.array([1, 1, 1, 2, 2, 3, 3, 3, 3]) >>> np.unique(a) array([1, 2, 3]) # 获取每个元素出现的次数 >>> np.unique(a, return_counts=True) (array([1, 2, 3]), array([3, 2, 4])) >>> a1, a2 = np.unique(a, return_counts=True) >>> for x,y in zip(a1, a2): ... print(x,y) ... 1 3 2 2 3 4 # 排序数组 >>> a = np.array([0, 2, 1, 4, 3, 7, 5]) >>> np.sort(a) array([0, 1, 2, 3, 4, 5, 7]) >>> a.sort() >>> a array([0, 1, 2, 3, 4, 5, 7]) 在numpy中,实现同一任务的方式有很多种,牢记每个函数的用法是很难的,只需要挑选几个常用函数数量掌握即可。
|