• 【Numpy】练习题100道(26-50题)


    #学习笔记#

    在学习神经网络的过程中发现对numpy的操作不是非常熟悉,遂找到了Numpy 100题。

    Git-hub链接

    1.题目列表

    26. 下面的脚本输出什么?(★☆☆)
    1. print(sum(range(5),-1))
    2. from numpy import *
    3. print(sum(range(5),-1))
    27. 考虑一个整数向量Z,以下哪些表达式是合法的?(★☆☆)
    1. Z**Z
    2. 2 << Z >> 2
    3. Z <- Z
    4. 1j*Z
    5. Z/1/1
    6. ZZ
    28. 下列表达式的结果是什么?(★☆☆)
    1. np.array(0) / np.array(0)
    2. np.array(0) // np.array(0)
    3. np.array([np.nan]).astype(int).astype(float)
    29. 如何将浮点数组向零的反方向四舍五入?(★☆☆)
    30. 如何找到两个数组中的公共值?(★☆☆)
    31. 如何忽略所有numpy警告(不推荐)?(★☆☆)
    32. 下面的表达式是否为真?(★☆☆)
    np.sqrt(-1) == np.emath.sqrt(-1)
    33. 如何获取昨天、今天和明天的日期?(★☆☆)
    34. 如何获取2016年7月的所有日期?(★★☆)
    35. 如何就地计算((A+B)*(-A/2))(无拷贝)?(★★☆)
    36. 使用4种不同的方法提取正数随机数组的整数部分 (★★☆)
    37. 创建一个5x5的矩阵,其行值范围从0到4 (★★☆)
    38. 考虑一个生成10个整数的生成器函数,并用它构建一个数组 (★☆☆)
    39. 创建一个大小为10的向量,值从0到1,不包括0和1 (★★☆)
    40. 创建一个大小为10的随机向量并对其进行排序 (★★☆)
    41. 如何比np.sum更快地对小数组求和?(★★☆)
    42. 考虑两个随机数组A和B,检查它们是否相等 (★★☆)
    43. 将一个数组设置为只读 (★★☆)
    44. 考虑一个随机的10x2矩阵表示笛卡尔坐标,将它们转换为极坐标 (★★☆)
    45. 创建大小为10的随机向量,并将最大值替换为0 (★★☆)
    46. 创建一个结构化数组,包含覆盖[0,1]x[0,1]区域的xy坐标 (★★☆)
    47. 给定两个数组,X和Y,构造柯西矩阵C (Cij =1/(xi - yj)) (★★☆)
    48. 打印每种numpy标量类型的最小和最大可表示值 (★★☆)
    49. 如何打印数组的所有值?(★★☆)
    50. 如何在向量中找到(给定标量的)最接近的值?(★★☆)

    2.题解

    26. 下面的脚本输出什么?(★☆☆)
    1. print(sum(range(5),-1))
    2. from numpy import *
    3. print(sum(range(5),-1))

     1.输出9
    2.输出10
    解释:在导入numpy库前,sum的第二个参数的作用是初始值,所以相当于:-1 + 0 + 1 + 2 + 3 + 4
    注意,这是初始值不是起始值,如果是sum(range(2,5),-1),实际上是: -1 + 2 + 3 + 4 

    第二个print输出的是10,在导入了NumPy之后,使用的sum函数实际上是numpy.sum,而不是内置的sum。在NumPy的sum函数中,第二个参数(在这个案例中是-1)不是初始值,而是指定求和操作应该沿着哪个轴进行。当使用-1作为轴参数时,它指的是数组的最后一个轴。

    27. 考虑一个整数向量Z,以下哪些表达式是合法的?(★☆☆)
    1. Z**Z
    2. 2 << Z >> 2
    3. Z <- Z
    4. 1j*Z
    5. Z/1/1
    6. ZZ
    1. # 1.Z**Z是合法的,它表示Z的Z对应元素的次方
    2. Z = np.array([1,2,3,4,5])
    3. # Z**Z
    4. # 输出:[1,4,27,256,3125]
    5. # 2.2 << Z >> 2是合法的,它表示Z的每个元素向左移动2位,再向右移动2位
    6. 2 << Z >> 2
    7. # 输出:[1,2,4,8,16]
    8. # 3.Z <- Z是合法的,表示检查Z中的每个元素是否小于-Z结果是一个布尔数组
    9. Z <- Z
    10. # 输出:[False False False False False]
    11. # 4.1j*Z是合法的,它表示将每个元素的实部和虚部分别相乘
    12. 1j*Z
    13. # 输出:[0.+1.j 0.+2.j 0.+3.j 0.+4.j 0.+5.j]
    14. # 5.Z/1/1是合法的,它表示将Z的每个元素除以1
    15. Z/1/1
    16. # 输出:[1. 2. 3. 4. 5.]
    17. # 6.ZZ不合法,在python中不能直接将比较运算符连续使用而不进行逻辑组合应当使用and or 连接
    28. 下列表达式的结果是什么?(★☆☆)
    1. np.array(0) / np.array(0)
    2. np.array(0) // np.array(0)
    3. np.array([np.nan]).astype(int).astype(float)
    1. np.array(0) / np.array(0)
    2. # 会得到一个运行时警告,并且结果将是NaN(not a number)
    3. # 因为在Numpy中除以0会产生一个无穷大的浮点数表示(inf),而当0除以0时,无法定义确切的数值,因此结果会被表示为NaN
    4. # NaN表示不是一个数字,它是一个特殊的浮点数类型,用于表示浮点数计算中的错误情况。
    5. # 值得注意的是,这是numpy的行为,而不是python内置出发运算符的行为。在python中,0除以0会抛出一个ZeroDivisionError异常。
    6. np.array(0) // np.array(0)
    7. # 会得到一个运行时警告,并且结果将是0
    8. # 因为在Numpy中,整数除以整数的结果是一个整数,所以0除以0的结果是0,这只适用于整数除法,对于浮点数除法,结果仍然会是NaN
    9. np.array([np.nan]).astype(int).astype(float)
    10. # 会得到一个警告,结果是:-2.147484e+09
    11. # 在numpy中,np.nan是一个特殊的浮点数类型,转化为整数时会得到一个负无穷大的整数值,而后转化为浮点数时,会得到一个浮点数能表示的最小数值
    29. 如何将浮点数组向零的反方向四舍五入?(★☆☆) 
    1. # 远离零点四舍五入可以使用numpy的'np.ceil'对正数和‘np.floor’对负数进行处理来表示,
    2. # 反方向四舍五入,1.4得2,-1.1得-2,1.5得2,-1.6得-2
    3. np.random.seed = 1
    4. Z = np.array([1.523127,-0.973028,1.488869,1.135266,1.706664,-1.815817,0.917672,-0.813865,-0.270150,0.310724])
    5. def round_away_from_zero(arr):
    6. # 对正数使用np.ceil,对负数使用np.floor
    7. return np.where(arr > 0, np.ceil(arr), np.floor(arr))
    8. round_away_from_zero(Z)
    9. # 输出:[2.,-1.,2.,2.,2.,-2.,1.,-1.,-1.,1.]
    30. 如何找到两个数组中的公共值?(★☆☆) 
    1. # 可以使用Numpy的'np.intersect1d'函数来找到两个数组的交集
    2. arr1 = np.array([1, 2, 3, 4, 5])
    3. arr2 = np.array([4, 5, 6, 7, 8])
    4. common_values = np.intersect1d(arr1, arr2)
    5. print(common_values)
    31. 如何忽略所有numpy警告(不推荐)?(★☆☆)
    1. import warnings
    2. # 忽略所有警告
    3. warnings.filterwarnings("ignore")
    32. 下面的表达式是否为真?(★☆☆)
    np.sqrt(-1) == np.emath.sqrt(-1)

     不为真

    np.sqrt: 当给定非负输入时,这个函数正常工作,返回输入的平方根。如果输入是负数,np.sqrt 会返回一个NaN(非数字),因为在实数范围内,负数没有平方根。
    np.emath.sqrt: 这个函数专门用于处理更广泛的数学问题,包括负数的平方根。对于负数输入,np.emath.sqrt 返回一个复数结果。例如,np.emath.sqrt(-1) 会返回虚数单位 1j,这是因为在复数域中,负一的平方根被定义为虚数单位。
    33. 如何获取昨天、今天和明天的日期?(★☆☆)
    1. # 可以使用Numpy的'numpy.datetime64'和'numpy.timedelta64'对象来获取昨天、今天和明天的日期
    2. today = np.datetime64('today', 'D') # 获取今天的日期
    3. yesterday = today - np.timedelta64(1, 'D') # 获取昨天的日期
    4. tomorrow = today + np.timedelta64(1, 'D') # 获取明天的日期
    5. print("Today:", today)
    6. print("Yesterday:", yesterday)
    7. print("Tomorrow:", tomorrow)
    8. # 输出结果:
    9. # Today: 2024-03-14
    10. # Yesterday: 2024-03-13
    11. # Tomorrow: 2024-03-15
    34. 如何获取2016年7月的所有日期?(★★☆)
    1. # 可以使用numpy的date_range函数配合numpy.datetime64来获取2016年7月的所有日期
    2. dates_july_2016 = np.arange('2016-07-01', '2016-08-02', dtype = 'datetime64[D]')
    35. 如何就地计算((A+B)*(-A/2))(无拷贝)?(★★☆)
    1. # 就地计算无拷贝意味着无新的空间被分配,计算结果直接覆盖了原始数据。
    2. A = np.array([[1, 2, 3], [4, 5, 6]])
    3. B = np.array([[7, 8, 9], [10, 11, 12]])
    4. B = A + B
    5. B = B * -A / 2
    6. print(B)
    7. # 输出:[[ -4. -10. -18.]
    8. # [-28. -40. -54.]]
    36. 使用4种不同的方法提取正数随机数组的整数部分 (★★☆)
    1. A = np.random.rand(3, 4)
    2. # 方法1: 使用np.floor函数.np.floor函数会向下取整,适用于正数
    3. A_int_floor = np.floor(A)
    4. # 方法2:使用np.trunc函数.np.trunc函数会截断小数部分,保留整数部分
    5. A_int_trunc = np.trunc(A)
    6. # 方法3:使用astype方法转换为整数类型
    7. A_int_astype = A.astype(int)
    8. # 方法4:使用np.round函数.np.round函数会四舍五入取整
    9. A_int_round = np.round(A)
    37. 创建一个5x5的矩阵,其行值范围从0到4 (★★☆)
    1. # 整数
    2. random_matrix = np.random.randint(0, 5, size=(5, 5)) # 在random.randint中,前两个参数控制生成的范围,size 是控制数组形状
    3. # 浮点数
    4. random_matrix_float = np.random.rand(5,5) * 4 # 在random.rand中,与randint不同,是控制形状的,因为其会默认生成0-1之间的随机浮点数
    38. 考虑一个生成10个整数的生成器函数,并用它构建一个数组 (★☆☆)
    random_matrix = np.random.randint(0, 10, size=(10,))
    39. 创建一个大小为10的向量,值从0到1,不包括0和1 (★★☆)
    1. # 可以直接使用np.random.rand函数生成,然后使用一些方法来控制其范围
    2. vec = np.random.rand(10) * (1 - 0.02) + 0.01
    40. 创建一个大小为10的随机向量并对其进行排序 (★★☆)
    1. random_vec = np.random.rand(10)
    2. sorted_vec = np.sort(random_vec)
    41. 如何比np.sum更快地对小数组求和?(★★☆)
    1. # 一般情况下,使用np.sum函数即可,如果追求更优可以使用np.einsum函数,其内部使用BLAS库来加速计算
    2. import time
    3. array = np.random.rand(1000000)
    4. start = time.time()
    5. np.sum(array)
    6. end = time.time()
    7. print('sum方法:',end - start)
    8. start1 = time.time()
    9. np.einsum('i->',array)
    10. end1 = time.time()
    11. print('einsum方法:',end1 - start1)
    12. # 输出结果:
    13. # sum方法: 0.0010001659393310547
    14. # einsum方法: 0.00099945068359375
    42. 考虑两个随机数组A和B,检查它们是否相等 (★★☆)
    1. A = np.random.rand(5)
    2. B = np.random.rand(5)
    3. # 严格相等
    4. # 检查A和B是否完全相等
    5. are_equal = np.array_equal(A, B)
    6. print("A和B完全相等:", are_equal)
    7. # 近似相等
    8. # 检查A和B是否近似相等
    9. are_close = np.allclose(A, B, atol=1e-8)
    10. print("A和B近似相等:", are_close)
    43. 将一个数组设置为只读 (★★☆)
    1. # 可以通过修改数组的flags.writeable属性来实现
    2. # 创建一个随机数组
    3. arr = np.random.rand(5)
    4. # 打印原始数组
    5. print("原始数组:", arr)
    6. # 将数组设置为只读
    7. arr.flags.writeable = False
    8. # 尝试修改数组
    9. try:
    10. arr[0] = 1
    11. except ValueError as e:
    12. print("错误信息:", e)
    13. # 输出结果:
    14. # 原始数组: [0.60665849 0.58338168 0.69089184 0.66636523 0.22322251]
    15. # 错误信息: assignment destination is read-only
    44. 考虑一个随机的10x2矩阵表示笛卡尔坐标,将它们转换为极坐标 (★★☆)
    1. # 在笛卡尔坐标系中的位置可以转换为极坐标系中的半径和角度
    2. # 创建一个随机的10x2矩阵表示笛卡尔坐标
    3. coords = np.random.rand(10, 2)
    4. r = np.sqrt(np.sum(coords**2, axis=1)) # 计算每个坐标点的模
    5. theta = np.arctan2(coords[:, 1], coords[:, 0]) # 计算每个坐标点的角度
    6. polar_coords = np.column_stack((r, theta))
    7. print('极坐标\n',polar_coords)
    45. 创建大小为10的随机向量,并将最大值替换为0 (★★☆)
    1. # 创建一个大小为10的随机向量
    2. random_matrix = np.random.rand(10)
    3. # 方法一
    4. max_value = np.max(random_matrix)
    5. random_matrix[random_matrix == max_value] = 0
    6. # 方法二
    7. max_index = np.argmax(random_matrix)
    8. random_matrix[max_index] = 0
    46. 创建一个结构化数组,包含覆盖[0,1]x[0,1]区域的xy坐标 (★★☆)
    1. # 定义结构化数据类型,包含两个浮点数字段x和y
    2. dtype = [('x', float), ('y', float)]
    3. # 创建一个结构化数组来覆盖[0,1]x[0,1]区域
    4. # 例如,我们可以创建一个4x4的网格
    5. num_points = 4
    6. x_values = np.linspace(0, 1, num_points)
    7. y_values = np.linspace(0, 1, num_points)
    8. # 使用网格的笛卡尔积来生成所有坐标点
    9. grid = np.meshgrid(x_values, y_values)
    10. # 组合x和y坐标点并创建结构化数组
    11. coordinates = np.zeros(num_points*num_points, dtype=dtype)
    12. coordinates['x'], coordinates['y'] = grid[0].flatten(), grid[1].flatten()
    13. print("结构化数组的x和y坐标:")
    14. print(coordinates)
    47. 给定两个数组,X和Y,构造柯西矩阵C (Cij =1/(xi - yj)) (★★☆)
    1. X = np.array([1, 2, 3, 4])
    2. Y = np.array([4, 5, 6, 7])
    3. # 将X变形为列向量,以便进行广播,利用广播机制可以有效避免显式编写嵌套循环
    4. X = X[:,np.newaxis]
    5. C = 1.0/(X - Y)
    6. print("柯西矩阵",C)
    48. 打印每种numpy标量类型的最小和最大可表示值 (★★☆)
    1. # 整数类型
    2. integer_types = [np.int8, np.int16, np.int32, np.int64]
    3. print("整数类型的最小和最大值:")
    4. for int_type in integer_types:
    5. info = np.iinfo(int_type)
    6. print(f"{int_type.__name__:>10}: min = {info.min}, max = {info.max}")
    7. # 浮点数类型
    8. float_types = [np.float16, np.float32, np.float64]
    9. print("\n浮点数类型的最小和最大正值(非精确值):")
    10. for float_type in float_types:
    11. info = np.finfo(float_type)
    12. print(f"{float_type.__name__:>10}: min = {info.min}, max = {info.max}")
    13. print(f"{float_type.__name__:>10}: smallest normal = {info.tiny}, largest positive = {info.max}")
    14. # 特殊注意:对于浮点数,最小值表示最小的正规化的浮点数。
    15. # 浮点数还有更小的非正规化数,但它们具有较小的精度。
    49. 如何打印数组的所有值?(★★☆)
    1. # 默认情况下,大数组的打印都会被截断,可以使用numpy.set_printoptions函数来调整打印选项
    2. # 通过设置参数'threshold'为numpy.inf,可以打印出所有元素
    3. np.set_printoptions(threshold=np.inf)
    4. large_array = np.random.rand(10000)
    5. print(large_array)
    50. 如何在向量中找到(给定标量的)最接近的值?(★★☆)
    1. # 可以通过计算数组中每个元素与该标量的绝对差值,然后找到这些差值中最小的那个
    2. x = np.random.randint(1,1000,size = 100)
    3. target = 888
    4. x_ = np.abs(x - target)
    5. result = x[x_ == x_.min()]
    6. print(result)

    后续会更行全部100题

    以上

    学习在于行动,总结和坚持,共勉

  • 相关阅读:
    构建知识图谱:从技术到实战的完整指南
    计算机毕设(附源码)JAVA-SSM基于的楼盘销售系统的设计与实现
    风景如画 全立交
    eslint如何支持uniapp的全局对象uni 和 H5+的plus 以及浏览器的全家对象 windows等...
    《JSP》
    Java学习笔记 --- 内部类
    用动图详细讲解——栈
    翻译软件排行榜-免费翻译软件排行榜-翻译软件推荐排行榜
    MySQL的零拷贝技术
    【Python 千题 —— 基础篇】菜品的价格
  • 原文地址:https://blog.csdn.net/CXY819394/article/details/136703757