赞
踩
将通过示例代码说明从NumPy数组ndarray中提取(获取)或删除满足条件的元素,行和列的方法。
在此对以下内容进行说明:
当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尺寸的同时提取行和列。
将描述以下两种类型。
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)
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]]
如果要删除元素/行/列而不是根据条件提取(获取),则有以下两种方法。
如果将负运算符〜添加到条件中,则将提取不满足条件的元素,行和列。这等效于删除满足条件的元素/行/列。
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]]
行和列也可以使用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]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。