18_NumPy数组ndarray中提取,删除满足条件的元素,行和列
18_NumPy数组ndarray中提取,删除满足条件的元素,行和列
将通过示例代码说明从NumPy数组ndarray中提取(获取)或删除满足条件的元素,行和列的方法。
在此对以下内容进行说明:
- 提取符合条件的元素
- 提取符合条件的行和列
- 使用numpy.all()提取所有元素均满足条件的行和列
- 使用numpy.any()提取具有至少一个满足条件的元素的行/列
- 删除符合条件的元素,行和列
- 使用否定运算符〜
- 使用numpy.delete()和numpy.where()
- 对于多种条件
当ndarray包含nan时,例如在读取缺少数据的csv文件时,请参考以下文章。
如果要替换或计算满足条件的元素,请参考以下文章。
提取符合条件的元素
如果要提取满足条件的元素,请使用ndarray [条件表达式]。
即使原始ndarray是多维数组,它也将返回一个展平的一维数组。
import numpy as np
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(a[a < 5])
# [0 1 2 3 4]
print(a < 10)
# [[ True True True True]
# [ True True True True]
# [ True True False False]]
print(a[a < 10])
# [0 1 2 3 4 5 6 7 8 9]
返回一个新的数组ndarray,保留原来的ndarray不变。以下示例是相同的。
b = a[a < 10]
print(b)
# [0 1 2 3 4 5 6 7 8 9]
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
也可以计算满足条件的元素的总和(sum(),平均均值(),最大值max(),最小值min()和标准差std()。
print(a[a < 5].sum())
# 10
print(a[a < 5].mean())
# 2.0
print(a[a < 5].max())
# 4
print(a[a < 10].min())
# 0
print(a[a < 10].std())
# 2.8722813232690143
提取符合条件的行和列
在提取元素的示例中,返回了一个一维数组,但是如果使用np.all(),np.any(),则可以在保留原始ndarray尺寸的同时提取行和列。
将描述以下两种类型。
- numpy.all():提取所有元素均满足条件的行/列
- numpy.any():提取具有至少一个满足条件的元素的行/列
使用numpy.all()提取所有元素均满足条件的行和列
np.all()是一个函数,如果在第一个参数中传递的ndarray的所有元素均为True,则返回True,否则返回Flase。
如果传递参数轴,则每个轴(每个尺寸)的所有元素均为True时,将返回True。对于二维数组,axis = 0将是列的结果,而axis = 1将是行的结果。
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(np.all(a < 5))
# False
print(np.all(a < 5, axis=0))
# [False False False False]
print(np.all(a < 5, axis=1))
# [ True False False]
print(a < 10)
# [[ True True True True]
# [ True True True True]
# [ True True False False]]
print(np.all(a < 10, axis=0))
# [ True True False False]
print(np.all(a < 10, axis=1))
# [ True True False]
将每个结果提供给行或列索引参考[行,列]时,将提取所需的行/列。在[line,:]的情况下,可以省略尾随的::。
print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
# [4 5]
# [8 9]]
print(a[np.all(a < 10, axis=1), :])
# [[0 1 2 3]
# [4 5 6 7]]
print(a[np.all(a < 10, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
如果不满足条件,则返回一个空的ndarray。
print(a[:, np.all(a < 5, axis=0)])
# []
即使只有一行或一列,维数也不会改变。
print(a[np.all(a < 5, axis=1)])
# [[0 1 2 3]]
print(a[np.all(a < 5, axis=1)].ndim)
# 2
print(a[np.all(a < 5, axis=1)].shape)
# (1, 4)
使用numpy.any()提取具有至少一个满足条件的元素的行/列
np.any()是一个函数,如果在作为第一个参数传递的ndarray中至少有一个True元素,则返回True,否则返回Flase。
如果传递参数轴,则每个轴(每个尺寸)至少有一个True元素时,将返回True。对于二维数组,axis = 0将是列的结果,而axis = 1将是行的结果。
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(np.any(a < 5))
# True
print(np.any(a < 5, axis=0))
# [ True True True True]
print(np.any(a < 5, axis=1))
# [ True True False]
可以按照与np.all()相同的方式提取满足条件的行和列。
print(a[:, np.any(a < 5, axis=0)])
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
删除符合条件的元素,行和列
如果要删除元素/行/列而不是根据条件提取(获取),则有以下两种方法。
- 使用否定运算符〜
- 使用numpy.delete()和numpy.where()
使用否定运算符〜
如果将负运算符〜添加到条件中,则将提取不满足条件的元素,行和列。这等效于删除满足条件的元素/行/列。
print(a[~(a < 5)])
# [ 5 6 7 8 9 10 11]
print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
# [4 5]
# [8 9]]
print(a[:, ~np.all(a < 10, axis=0)])
# [[ 2 3]
# [ 6 7]
# [10 11]]
print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
print(a[~np.any(a < 5, axis=1)])
# [[ 8 9 10 11]]
使用numpy.delete()和numpy.where()
行和列也可以使用np.delete()和np.where()删除。
np.delete()将目标ndarray,要删除的索引(行号,列号等)以及目标轴(维)轴设置为参数。
在二维数组的情况下,axis = 0删除行,而axis = 1删除列,这与上面的np.all()和np.any()不同。
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.delete(a, [0, 2], axis=0))
# [[4 5 6 7]]
print(np.delete(a, [0, 2], axis=1))
# [[ 1 3]
# [ 5 7]
# [ 9 11]]
np.where()返回满足条件的元素的索引。
对于多维数组,它是满足每个维(行,列)条件的索引(行号,列号)列表的元组。
print(a < 2)
# [[ True True False False]
# [False False False False]
# [False False False False]]
print(np.where(a < 2))
# (array([0, 0]), array([0, 1]))
print(np.where(a < 2)[0])
# [0 0]
print(np.where(a < 2)[1])
# [0 1]
另请参阅以下有关np.where()的文章。
通过组合这两个功能,可以删除满足条件的行和列。
print(np.delete(a, np.where(a < 2)[0], axis=0))
# [[ 4 5 6 7]
# [ 8 9 10 11]]
print(np.delete(a, np.where(a < 2)[1], axis=1))
# [[ 2 3]
# [ 6 7]
# [10 11]]
print(a == 6)
# [[False False False False]
# [False False True False]
# [False False False False]]
print(np.where(a == 6))
# (array([1]), array([2]))
print(np.delete(a, np.where(a == 6)))
# [ 0 3 4 5 6 7 8 9 10 11]
print(np.delete(a, np.where(a == 6)[0], axis=0))
# [[ 0 1 2 3]
# [ 8 9 10 11]]
print(np.delete(a, np.where(a == 6)[1], axis=1))
# [[ 0 1 3]
# [ 4 5 7]
# [ 8 9 11]]
如上例所示,删除甚至具有一个满足条件的元素的行/列(与使用np.any()时相同)。
如果执行诸如计算由np.where()获取的索引数之类的处理,则可以删除满足所有条件的行和列(与使用np.all()时相同),但是np使用.all()更容易。
对于多种条件
如果要组合多个条件,请将每个条件表达式括在()中,并将其与&或|连接。
print(a[(a < 10) & (a % 2 == 1)])
# [1 3 5 7 9]
print(a[np.any((a == 2) | (a == 10), axis=1)])
# [[ 0 1 2 3]
# [ 8 9 10 11]]
print(a[:, ~np.any((a == 2) | (a == 10), axis=0)])
# [[ 0 1 3]
# [ 4 5 7]
# [ 8 9 11]]
上一篇: Python标准库学习笔记3:算法