NumPy 快速入门:数组对象的排序、插入、删除、添加及其他特殊方法介绍
NumPy 快速入门:数组对象的类列表方法及专用方法介绍
前言:
上两篇博客分别对 NumPy 中 数组概念、索引等基础内容 及 算数运算、统计计算等常用计算方法 做了简单的介绍。本篇博客将继续介绍 NumPy 中的其他一些常用方法,分类两个方面:
- 类列表方法:排序、插入、添加删除等;
- 特殊方法。
1、类列表方法:
多维数组中的数据通常可以用 Python 的列表表达出来,只是会麻烦很多,数组对象中也有许多类似于列表操作的方法:
a. 数组的排序:
sort 方法可用于数组的排序:
sort(a, axis=-1, kind=None, order=None)
示例:
# 数组排序
g6 = np.array([[1,4],[3,2]])
print(np.sort(g6))
'''
[[1 4]
[2 3]]
'''
特定轴方向上的排序:
print(np.sort(g6,axis=None)) # 丢弃轴,将数组变为一维后排序
# [1 2 3 4]
print(np.sort(g6,axis=0))
'''
[[1 2]
[3 4]]
'''
b. 排序索引:
数组对象的排序相对于 Python 列表的简单排序还提供了获取排序的索引方法,如:
argsort :获取一维数组的排序索引
argsort(a, axis=-1, kind=None, order=None)
g7 = np.array([3,1,2])
print(np.argsort(g7))
# [1 2 0]
argmax、argmin :获取数组对象中最大值、最小值索引
argmax(a, axis=None, out=None)
argmin(a, axis=None, out=None)
print(np.argmax(g7))
# 0
print(np.argmin(g7))
# 1
searchsorted : 获取元素在数组中排序索引
searchsorted(a, v, side=‘left’, sorter=None)
示例:
print(np.searchsorted([1,2,4,5,6], 3))
# 2
print(np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3]))
# [0 5 1 2]
解析:其实 searchsorted 方法是获取第二个参数对象在 第一个参数中的排序索引。如 3 在 数组 [ 1,2,4,5,6 ] 应该排在第 2 位 (第一位为 0 )。
c. 数组的删除:
delete:删除数组中的某些元素:
delete(arr, obj, axis=None)
示例:
h5 = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print(h5)
'''
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
'''
print(np.delete(h5,0))
# [ 2 3 4 5 6 7 8 9 10 11 12]
print(np.delete(h5,1))
# [ 1 3 4 5 6 7 8 9 10 11 12]
解析:这里删除的 obj 是按索引进行删除的,并且如果不指定 axis 返回的是将多维数组展平的一维数组。
指定轴进行删除:
print(np.delete(h5,0,0)) # 删除行
'''
[[ 5 6 7 8]
[ 9 10 11 12]]
'''
print(np.delete(h5,0,1)) # 删除列
'''
[[ 2 3 4]
[ 6 7 8]
[10 11 12]]
'''
d. 数组的插入:
insert:将元素插入到数组中的指定位置
insert(arr, obj, values, axis=None)
不指定轴方向:
h6 = np.array([[1, 1], [2, 2], [3, 3]])
print(np.insert(h6,1,5))
# [1 5 1 2 2 3 3]
指定轴方向:
print(np.insert(h6,1,5,axis=1))
'''
[[1 5 1]
[2 5 2]
[3 5 3]]
'''
e. 数组的增加:
append :在数组的末尾增加内容
append(arr, values, axis=None)
示例:
h8 = np.array([[1, 1], [2, 2], [3, 3]])
print(np.append(h8, 4))
# [1 1 2 2 3 3 4]
也可以指定轴方向,将元素添加到数组对象的末尾。但是注意:添加的对象维度需与元数组相同,示例:
print(np.append(h8,[[4,4]],axis=0))
'''
[[1 1]
[2 2]
[3 3]
[4 4]]
'''
print(np.append(h8,[[1],[2],[3]],axis=1))
'''
[[1 1 1]
[2 2 2]
[3 3 3]]
'''
2、特殊方法:
a. linspace:等距取值
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,axis=0):
示例:
e1 = np.linspace(-2.5, 2.5, 6)
print(e1)
# [-2.5 -1.5 -0.5 0.5 1.5 2.5]
b. piecewise:分段赋值
e1 = np.linspace(-2.5, 2.5, 6)
print(e1)
# [-2.5 -1.5 -0.5 0.5 1.5 2.5]
e2 = np.piecewise(e1, [e1 < 0, e1 >= 0], [-1, 1])
print(e2)
# [-1. -1. -1. 1. 1. 1.]
c. select:条件选择
select(condlist, choicelist, default=0):
e3 = np.arange(6)
c3 = [e3 < 2, e3 > 3]
choice = [e3, e3 ** 2]
print(np.select(c3,choice))
# [ 0 1 0 0 16 25]
e4 = np.select(c3,choice,default=np.nan)
print(e4)
# [ 0. 1. nan nan 16. 25.]
解析:
NumPy 提供了许多根据条件来对数组元素进行取值的方法,如上节博客中的逻辑选择 where 方法,数组修剪 clip ,数组压缩 compress 方法,这里又出现 piecewise 和 select 方法,但是仔细分析会发现其适用情况是有区别的。后续会花一篇博客来详细讲讲以上几个方法的区别和各自适用场景。
d. diff:相邻元素差值
diff(a, n=1, axis=-1, prepend=np._NoValue, append=np._NoValue)
e7 = np.array([[1, 3, 6, 10], [0, 5, 6, 8]])
e8 = np.diff(e7)
print(e8)
'''
[[2 3 4]
[5 1 2]]
'''
e9 = np.diff(e7,axis=0)
print(e9)
# [[-1 2 0 -2]]
e. trim_zeros:去零操作
trim_zeros(filt, trim=‘fb’):
f1 = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0))
print(np.trim_zeros(f1))
# [1 2 3 0 2 1]
f. extract:返回满足条件元素
extract(condition, arr):
f2 = np.arange(12).reshape(3,4)
cf2 = np.mod(arr, 3) == 0
print(np.extract(cf2,f2))
# [0 3 6 9]
g. place: 依次替换符合条件值:
place(arr, mask, vals)
f3 = np.arange(6).reshape(2, 3)
print(f3)
'''
[[0 1 2]
[3 4 5]]
'''
np.place(f3,f3>2,[6,5,7])
print(f3)
'''
[[0 1 2]
[6 5 7]]
'''
h. take :按索引提取元素
take(a, indices, axis=None, out=None, mode=‘raise’)
g1 = [4, 3, 5, 7, 6, 8]
gi1 = [0, 1, 4]
g2 = np.take(g1,gi1)
print(g2)
# [4 3 6]
g3 = np.array(g1)
print(g3[gi1])
# [4 3 6]
gi2 = [[0,1],[2,3]]
print(np.take(g3,gi2))
'''
[[4 3]
[5 7]]
'''
注:有点类似花式索引,但:当索引为嵌套列表,会返回和嵌套列表结构类型的多维数组。
i. repeat:重复
repeat(a, repeats, axis=None)
print(np.repeat(3,4))
# [3 3 3 3]
g4 = np.array([[1,2],[3,4]])
print(np.repeat(g4,2))
# [1 1 2 2 3 3 4 4]
print(np.repeat(g4,2,axis=1))
'''
[[1 1 2 2]
[3 3 4 4]]
'''
print(np.repeat(g4,2,axis=0))
'''
[[1 2]
[1 2]
[3 4]
[3 4]]
'''
j. put:替换
put(a, ind, v, mode=‘raise’)
g5 = np.arange(5)
np.put(g5,[0,2],[55,66])
print(g5)
# [55 1 66 3 4]
k. around:四舍五入
around(a, decimals=0, out=None)
h4 = np.array([1.1,1.6,2.4,0.44,4.56])
print(np.around(h4))
# [1. 2. 2. 0. 5.]
print(np.around(h4,decimals=1))
# [1.1 1.6 2.4 0.4 4.6]
结尾:
以上就是本篇博客的全部内容,方法都很简单,理解起来都没什么问题,就是比较零碎,感谢阅读。
该专栏着重介绍Python的科学计算、数据分析 NumPy 与 Pandas 模块的使用方法,并会结合统计学概念及数据分析相关方法对一些案例进行分析。
感兴趣的朋友,可以点个 关注 或 收藏 。如在博客中遇到任何问题或有一些想法、需求,可留言或私信。
创作不易,你的支持是我最大的动力,感谢 !
本文地址:https://blog.csdn.net/zhouz92/article/details/107498733