本文记录日常工作中遇到的查找操作,持续更新。
注意:输入必须是 数组,不能是 list
极值
min,max 返回极值
argmin(a, axis=None, out=None), 返回极值所在的位置;不带 axis,先拉直,再找极值;带 axis,找某个维度的极值
b = np.array([[1, 2, 3, 5], [4, 6, 2, 6]]) print(np.max(b)) # 返回最大值 6 print(np.min(b)) # 返回最小值 1 print(np.argmax(b)) # 返回第一个最大值的位置 5 print(np.argmin(b)) # 返回第一个最小值的位置 0 print(np.argmin(b, axis=1)) # [0 2]
NaN值
nan 值由多种表达形式,如 None,np.nan,np.NaN等
isnan,输入可以是 一维,也可以是 二维,返回布尔索引
x = np.array(range(10), dtype=np.float) y = np.array(range(10,20)) print(x.shape) # (10,) print(x) # [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] print(y) # [10 11 12 13 14 15 16 17 18 19] x[3] = None # 插入 nan x[5] = np.NaN # 插入 nan print(x) # [ 0. 1. 2. nan 4. nan 6. 7. 8. 9.] # isnan 返回索引 print(np.isnan(x)) # [False False False True False True False False False False] print(y[np.isnan(x)]) # [13 15] print(y[~np.isnan(x)]) # [10 11 12 14 16 17 18 19]
如果想返回数值索引,可如下操作
data4 = np.array([1, 3, np.nan, 5]) ## isnan 返回 nan 值的布尔下标 print np.isnan(data4) # [False False True False] ## where 找到 nan 值的数值下标 print np.where(np.isnan(data4)) # (array([2]),) print np.where(~np.isnan(data4)) # (array([0, 1, 3]),)
注意,nan 值 不能用 where 查找
print(np.where(x != np.NaN)) # (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),) 这样不行
经常遇到这么一个错误
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
错误原因:有异常的数据类型,非 int float
解决方法:转换数据类型,.astype('float')
where 条件
where,返回tuple,第一个值是索引,第二个是空值
1. 输入必须是 数组,不能是 list
2. 输入一般是一维,行向量或者列向量都可以
3. 输入多维,将返回两个索引,行向量或者列向量返回不同
argwhere,直接返回索引,返回为二维数组,列向量
# list 返回错误 data = range(10) print np.where(data>6) # (array([0]),) # 一维数组 data1 = np.array(range(0, 20, 2)) print np.where(data1>6) # (array([7, 8, 9]),) print np.where(data1.T>6) # (array([7, 8, 9]),) # 二维数组 data2 = np.array([range(0, 20, 2)]) print np.where(data2>6) # (array([0, 0, 0]), array([7, 8, 9])) # 多行多列 data3 = np.array([range(10), range(10)]) print(data3) print np.where(data3>6) # (array([0, 0, 0, 1, 1, 1]), array([7, 8, 9, 7, 8, 9])) print np.where(data3.T>6) # (array([7, 7, 8, 8, 9, 9]), array([0, 1, 0, 1, 0, 1])) ## argwhere 直接返回索引 print np.argwhere(data1>6) # [[4] # [5] # [6] # [7] # [8] # [9]] print np.argwhere(data1.T>6) # [[4] # [5] # [6] # [7] # [8] # [9]]
where 也可输入多个条件
# 求公共部分 print np.intersect1d([1, 4, 3], [3, 4, 5]) # [3 4] # 多个条件 data2 = np.array([1,5, 11,16,20]) print np.where(data2>10) # (array([2, 3, 4]),) print np.where((data2>10) & (data2<18)) # (array([2, 3]),) print np.where(np.logical_and(data2>10, data2<18)) # (array([2, 3]),) print np.intersect1d(np.where(data2>10)[0], np.where(data2<18)[0]) # [2 3]
extract 条件
extract(condition, arr),按某条件查找,返回元素
print(np.extract(np.isnan(x), x)) # [nan nan] print(np.extract(np.isnan(x), y)) # [13 15] print(np.extract(x>8, x)) # [9.]
非0元素
nonzero,返回tuple,第一个值是索引,第二个是空值
x = [1, 0, 3, 0] print(np.nonzero(x)) # (array([0, 2]),)
未完待续...