zoukankan      html  css  js  c++  java
  • numpy-查找操作大全

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

    注意:输入必须是 数组,不能是 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]),)

    未完待续...

  • 相关阅读:
    怎样用OpenScales发布这些瓦片地图?
    mysql在linux下命令备份数据库
    jQuery EasyUI
    JQuery遮罩层登录
    C#通过线程完成定时执行事件
    JS中showModalDialog 详细使用
    sql时间函数
    asp网页设计流量统计代码
    Rational Rose、PowerDesign、visio的比较
    win环境下eclipse安装指引
  • 原文地址:https://www.cnblogs.com/yanshw/p/11330715.html
Copyright © 2011-2022 走看看