在numpy中,有一系列对数组进行操作的函数,在使用这些函数之前,必须先了解以下两个基本概念 副本 视图 副本是一个数组的完整拷贝,就是说,先对原始数据进行拷贝,生成一个新
在numpy中,有一系列对数组进行操作的函数,在使用这些函数之前,必须先了解以下两个基本概念
副本是一个数组的完整拷贝,就是说,先对原始数据进行拷贝,生成一个新的数组,新的数组和原始数组是独立的,对副本的操作并不会影响到原始数组;视图是一个数组的引用,对引用进行操作,也就是对原始数据进行操作,所以修改视图会对应的修改原始数组。
在使用函数和方法时,我们首先要明确其操作的是原始数组的副本还是视图,然后根据需要来做选择。一个基本的例子如下
>>> 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操作的是视图, 操作之后原始数组的形状发生了变化。
常用的是数组操作有以下几种
1. 改变数组维度和形状
一开始已经介绍了reshape和resize方法,可以修改数组的维度和形状,除此之外,ravel和flatten则可以将多维数组转换为一维数组,用法如下
>>> 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])
2. 数组的转置
数组转置是最高频的操作,在numpy中,有以下几种实现方式
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]])
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列,也要将添加项调整为二维数组。
4. 数组元素的增加和删除
这里的增加和删除指的是在指定轴的索引上进行操作,用法如下
>>> 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中,实现同一任务的方式有很多种,牢记每个函数的用法是很难的,只需要挑选几个常用函数数量掌握即可。
·end·
一个只分享干货的
生信公众号