本文记录日常工作中遇到的查找操作,持续更新。

 

注意:输入必须是 数组,不能是 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]))   0行7列,0行8列,0行9列,1行7列,1行8列,1行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]),)

 

 

未完待续...