zoukankan      html  css  js  c++  java
  • 使用NumPy、Numba的简单使用(二)

      本来要写NLP第三课动态规划的,日了,写到一半发现自己也不会了,理论很简单,动态规划咋回事也知道,但是实现在源码上还是有点难度,现在简单给予题目描述,小伙伴也可以来思考一下,例题一,我们现在有1元硬币,2元硬币,5元硬币和10元硬币。我们要将M金额的钱换为硬币,保证硬币数目最少,我们的换法是什么,例题二,我们现在有M米的绳子,截成N段(N的长度一定为整数),将N段绳子的长度相乘,保证乘积结果为最大值,我们需要截取,过几天再回头来写这个吧。我们今天来继续说说numpy的用法,这次我们通过习题来看看numpy的用法。

      问题:将arr中的所有奇数替换为-1,而不改变arr。(提示where)

    arr = np.arange(10) 
    out = np.where(arr % 2 == 1, -1, arr) 

    where语法为,参数一是条件,参数二是满足条件的要替换为什么,参数三是输入array。

      问题:将一维数组转换为2行的2维数组,给定:np.arange(10)

    arr = np.arange(10) 
    out = np.reshape(2,-1) 
    reshape语法为(行,列)若参数二列为-1,为不限制

      问题:垂直堆叠数组a和数组b,给定:a = np.arange(10).reshape(2,-1) b = np.repeat(1, 10).reshape(2,-1) 期望的输出:

    > array([[0, 1, 2, 3, 4],

    > [5, 6, 7, 8, 9],

    > [1, 1, 1, 1, 1],

    > [1, 1, 1, 1, 1]])

    a = np.arange(10).reshape(2,-1)
    b = np.repeat(1, 10).reshape(2,-1)
    np.concatenate([a, b], axis=0) # 方法一
    np.vstack([a, b])  # 方法二
    np.r_[a, b] # 方法三

    方法一:concatenate语法是参数一列表,axis=0为纵向堆叠,1位横向

    方法二:vstack垂直堆叠,扩展hstack为横向。

    方法三:r_垂直堆叠,扩展c_为横向。

     问题:创建以下模式而不使用硬编码。只使用numpy函数和下面的输入数组a。

    给定:

    a = np.array([1,2,3])` 期望的输出:

    > array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])

    a = np.array([1,2,3])
    np.r_[np.repeat(a, 3), np.tile(a, 3)]

    说明:np.repeat(a, 3)获得到array([1, 1, 1, 2, 2, 2, 3, 3, 3]),np.tile(a, 3)获得到array([1, 2, 3, 1, 2, 3, 1, 2, 3]),然后应r_进行堆叠

      问题:获取数组a和数组b之间的公共项。ab的交集

    np.intersect1d(a,b)

      问题:从数组a中删除数组b中的所有项。给定:a = np.array([1,2,3,4,5]) b = np.array([5,6,7,8,9]) 期望的输出:>array([1,2,3,4])

    a = np.array([1,2,3,4,5]) 
    b = np.array([5,6,7,8,9])
    np.setdiff1d(a,b)

    setdiffld使用时注意顺序,在第一个参数内除去包含第二个元素的数据,且不包含剩余第二个参数的元素。(可能有点绕嘴)。

      问题:获取a和b元素匹配的位置。 

    a = np.array([1,2,3,2,3,4,3,4,5,6]) 
    b = np.array([7,2,10,2,7,4,9,4,9,8])
    np.where(a==b)

      问题:获取5到10之间的所有项目。

    a = np.array([2, 6, 1, 9, 10, 3, 27]) 
    index = np.where((a >= 5) & (a <= 10))
    a[index]

      问题:在数组arr中交换行1和2。

    arr = np.arange(9).reshape(3,3) 
    arr[[1,0,2],:]

      问题:在数组arr中交换列1和2。

    arr = np.arange(9).reshape(3,3) 
    print(arr)
    arr[:, [1,0,2]]

      问题:反转二维数组arr的行。

    arr = np.arange(9).reshape(3,3)
    arr[::-1]

      问题:反转二维数组arr的列。

    arr = np.arange(9).reshape(3,3)
    arr
    arr[:, ::-1]

      问题:创建一个形状为5x3的二维数组,以包含5到10之间的随机十进制数。

    arr = np.arange(9).reshape(3,3)
    
    # Solution Method 1:
    rand_arr = np.random.randint(low=5, high=10, size=(5,3)) + np.random.random((5,3))
    # print(rand_arr)
    
    # Solution Method 2:
    rand_arr = np.random.uniform(5,10, size=(5,3))
    print(rand_arr)

    这里需要详细说明一下,arr[a,b] 也就是arr的切片 例如:a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2,而在我们的二维数组中,我们可以使用‘,’;例如a[X,M],这时我们就取出,第X+1行的第M+1个元素。

    还有:和,还有...并用的。我们来看一个例子,:也就是所有,例如a[:,2]就是我们要取出管他多少行的第三列所有。同事a[2,:]也是如此,第二行的所有,管他多少列呢。

    我们上面说的::N两个冒号连接在一起就是从第:个元素,取到第:个元素,步长是N,::也就是说取得所有吧。步长为负数时会反转。下期我们继续说说Nump的用法吧~!

  • 相关阅读:
    UVA247 电话圈 Calling Circles
    Python开发之路
    Day 8-模块
    Homework
    Day 7- 装饰器
    Day 6-文件操作的其他方法 迭代器 生成器
    数据-进制
    Day 5-变量与高阶函数
    Day 4-集合、百分号拼接及函数
    Day 3-Python列表、元祖、词典
  • 原文地址:https://www.cnblogs.com/cxiaocai/p/11222204.html
Copyright © 2011-2022 走看看