新手小白,快练起来!
每天刷一道,领导往后稍!!!冲冲冲!!!
Ex1:NumPy的向量化运算#
-
给定一个正整数列表,请找出缺失的最小正整数。
arr = np.array([2,3,4]) get_miss(arr) 1 arr = np.array([6,3,5,1,2]) get_miss(arr) 4 arr = np.array([5,2,1,3,4]) get_miss(arr) 6
思路比较简单,就随便写:
import numpy as np import pandas as pd import matplotlib.pyplot as plt def get_miss(arr): res_1 = np.setdiff1d(np.arange(arr.max())+1,arr) if len(res_1) == 0: return arr.max()+1 else: return res_1.min() get_miss(np.array([5,2,3,4])) 1
-
设计一个生成二维NumPy数组的函数get_res(),其输入为正整数n,返回的数组构造方式如下:第1行填入1个1,第2行在上一行填入位置的下一列连续填入2个2,第3行在第二行最后一个填入位置的下一列连续填入3个3,…,第n行在第n-1行最后一个填入位置的下一列连续填入n个n。
n = 4 get_res(n) array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 2., 2., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 3., 3., 3., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 4., 4., 4., 4.]])
刚开始没什么思路,后面参考了下面朋友的博文的解题思路,构建两个同size数组,通过where运算取舍,得到最终结果,原博如下:https://www.bilibili.com/read/cv18549630
善于观察的朋友们可能已经发现,两个数组红框中在红框中位置的元素完全相同,其他位置不同,而需要我们构造的数组就是红框中的元素加其他位置为0构成的。
-
那现在只需要构建这两个数组arr1,arr2,通过where(arr1==arr2,arr1,0)即可得解。话不多说,上代码吧:
-
def get_res(n): arr1 = np.ones([n,n*(n+1)//2])*((np.arange(n)+1).reshape([n,-1])) #先构造arr1,即构造给定size的全为1的数组,再与[1,2,3,4,...,n]对应行相乘 tmp = np.tril(np.ones([n,n]))*((np.arange(n)+1).reshape([n,-1])) #构造上三角全为0,下三角全为1的下三角矩阵,对应行乘[1,2,3,4,...,n] tmp = tmp.flatten() #将tmp数组一维展开 tmp = tmp[tmp>0] #去除一维数组中0元素 arr2 = np.tile(tmp,[n,1]) #将一维数组铺开为size=[n,1]的二维数组,即arr2 return np.where(arr2 == arr1,arr1,0) get_res(5) def get_res(n): arr1 = np.ones([n,n*(n+1)//2])*((np.arange(n)+1).reshape([n,-1])) #先构造arr1,即构造给定size的全为1的数组,再与[1,2,3,4,...,n]对应行相乘 tmp = np.tril(np.ones([n,n]))*((np.arange(n)+1).reshape([n,-1])) #构造上三角全为0,下三角全为1的下三角矩阵,对应行乘[1,2,3,4,...,n] tmp = tmp.flatten() #将tmp数组一维展开 tmp = tmp[tmp>0] #去除一维数组中0元素 arr2 = np.tile(tmp,[n