欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NumPy 快速入门:数组对象的排序、插入、删除、添加及其他特殊方法介绍

程序员文章站 2022-05-28 22:17:24
本篇博客主要介绍 NumPy中,数组对象的类列表方法: 排序、删除、插入及一些特殊方法如: linspace:等距取值、piecewise 分段赋值、 select 条件选择、diff 相邻元素差值等。...

前言:

上两篇博客分别对 NumPy 中 数组概念、索引等基础内容算数运算、统计计算等常用计算方法 做了简单的介绍。本篇博客将继续介绍 NumPy 中的其他一些常用方法,分类两个方面:

  1. 类列表方法:排序、插入、添加删除等;
  2. 特殊方法。

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]

结尾:

以上就是本篇博客的全部内容,方法都很简单,理解起来都没什么问题,就是比较零碎,感谢阅读。

【Numpy Pandas 数据分析】专栏

该专栏着重介绍Python的科学计算、数据分析 NumPy 与 Pandas 模块的使用方法,并会结合统计学概念及数据分析相关方法对一些案例进行分析。

感兴趣的朋友,可以点个 关注收藏 。如在博客中遇到任何问题或有一些想法、需求,可留言或私信。

创作不易,你的支持是我最大的动力,感谢 !

本文地址:https://blog.csdn.net/zhouz92/article/details/107498733