【Numpy】练习题100道(51-75题)

🌻个人主页:相洋同学
🥇学习在于行动、总结和坚持,共勉!

#学习笔记#

Git-hub链接

目录

1.题目列表

2.题解


1.题目列表

51. 创建一个表示位置(x,y)和颜色(r,g,b)的结构化数组(★★☆)

52. 考虑一个形状为(100,2)的随机向量,代表坐标,找出点对点的距离(★★☆)

53. 如何将一个浮点(32位)数组就地转换为整数(32位)数组?

54. 如何读取以下文件?(★★☆)

1, 2, 3,
 4, 5 6,
 , , 7, 
8 , , 
9,10,11

55. 对于numpy数组,有什么等同于enumerate的函数?(★★☆)

56. 生成一个通用的2D高斯样数组(★★☆)

57. 如何在一个2D数组中随机放置p个元素?(★★☆)

58. 减去矩阵每行的平均值(★★☆)

59. 如何按照第n列排序一个数组?(★★☆)

60. 如何判断一个给定的2D数组是否有空列?(★★☆)

61. 在一个数组中找到最接近给定值的数(★★☆)

62. 考虑两个形状分别为(1,3)和(3,1)的数组,如何使用迭代器计算它们的和?(★★☆)

63. 创建一个具有name属性的数组类(★★☆)

64. 考虑一个给定的向量,如何给由第二个向量索引的每个元素加1(注意重复索引)?(★★★)

65. 如何根据索引列表(I)将向量(X)的元素累加到一个数组(F)中?(★★★)

66. 考虑一个(w,h,3)形状的图像(dtype=ubyte),计算唯一颜色的数量(★★☆)

67. 考虑一个四维数组,如何一次性获得最后两轴的和?(★★★)

68. 考虑一维向量D,如何使用描述子集索引的同大小向量S来计算D的子集均值?(★★★)

69. 如何获得点积的对角线?(★★★)

70. 考虑向量[1, 2, 3, 4, 5],如何构建一个新向量,在每个值之间插入3个连续的零?(★★★)

71. 考虑一个维度为(5,5,3)的数组,如何将其乘以一个维度为(5,5)的数组?(★★★)

72. 如何交换数组的两行?(★★★)

73. 考虑一组描述10个三角形(具有共享顶点)的10个三元组,找到组成所有三角形的唯一线段集(★★★)

74. 给定一个对应于bincount的排序数组C,如何产生一个数组A使得np.bincount(A) == C?(★★★)

75. 如何使用数组上的滑动窗口计算平均值?(★★★)

2.题解

 51. 创建一个表示位置(x,y)和颜色(r,g,b)的结构化数组(★★☆)

dtype = [('position',[('x',float),('y',float)]),
         ('color',[('r',int),('g',int),('b',int)])]

position_and_color = np.zeros(10,dtype=dtype)
position_and_color['position']['x'] = np.random.uniform(0,100,10)
position_and_color['position']['y'] = np.random.uniform(0,100,10)
position_and_color['color']['r'] = np.random.randint(0,256,10)
position_and_color['color']['g'] = np.random.randint(0,256,10)
position_and_color['color']['b'] = np.random.randint(0,256,10)

52. 考虑一个形状为(100,2)的随机向量,代表坐标,找出点对点的距离(★★☆)

points = np.random.rand(100,2) # 表示100个点的坐标
diff = points[:,np.newaxis,:] - points[np.newaxis,:,:] # 计算点与点之间的距离,这里我们扩展了维度使得每一个点都和原来的点有比较 
distance = np.linalg.norm(diff,axis=-1) # 计算每一对点之间的距离,linalg就是计算的范数,计算的是一个向量所有元素的平方,和,然后开根
distance # 100个点会产生10000个距离

53. 如何将一个浮点(32位)数组就地转换为整数(32位)数组?

float_array = np.array([1.2,1.3,2.3,2.4,2.4],dtype=np.float32)
int_array = float_array.astype(np.int32)

54. 如何读取以下文件?(★★☆)

1, 2, 3,
 4, 5 6,
 , , 7, 
8 , , 
9,10,11
# 读取文件
# 'data.csv' 是文件路径,dtype = float 指定数组的数据类型,delimiter = ',' 指定分隔符
# missing_value = ' ' 指定缺失值,如果文件中缺失值用空格表示,那么这里可以指定为空格
data = np.genfromtxt('data.csv',dtype=float,delimiter=',',missing_value=' ',filling_values=np.nan)
# filling_values 指定缺失值被替换的值,这里我们用NaN表示

55. 对于numpy数组,有什么等同于enumerate的函数?(★★☆)

arr = np.array([[1,2],[3,4]])

for index,value in np.ndenumerate(arr):
    print(index,value)
# 输出结果:
# (0, 0) 1
# (0, 1) 2
# (1, 0) 3
# (1, 1) 4

56. 生成一个通用的2D高斯样数组(★★☆)

def generate_2d_gaussian(size, sigma):
    """生成一个给定大小和标准差的 2D 高斯核,包含归一化常数。"""
    # 生成 x 和 y 的坐标
    x, y = np.meshgrid(np.linspace(-size // 2, size // 2, size), 
                       np.linspace(-size // 2, size // 2, size))
    # 计算高斯函数,包含归一化常数
    g = (1 / (2 * np.pi * sigma**2)) * np.exp(-(x**2 + y**2) / (2 * sigma**2))
    # 归一化,使所有值的和为 1
    g /= g.sum()
    return g

# 示例:生成一个 5x5 大小,标准差为 1 的高斯核
gaussian_kernel = generate_2d_gaussian(5, 1)

57. 如何在一个2D数组中随机放置p个元素?(★★☆)

def place_elements_randomly(shape,p,value=1):
    '''
    在给定形状的2D数组中随机放置p个元素,默认为1
    
    :param shape:一个元组,制定了2D数组的形状
    :param p:整数,指定要放置的元素个数
    :param value:要放置的元素的值,默认为1
    :return:修改后的2D数组
    '''
    # 创建初始数组
    arr = np.zeros(shape,dtype=int)
    
    # 计算所有可能可能的位置
    all_positions = np.arange(arr.size)
    
    # 随机选择p个不重复的位置
    chosen_positions = np.random.choice(all_positions,p,replace=False)
    
    # 在选定的位置放置元素
    np.put(arr,chosen_positions,value)
    
    return arr

58. 减去矩阵每行的平均值(★★☆)

arr = np.array([[0,1,2],[1,1,1],[2,2,2]])
arr.mean(axis=1)
arr_mean = arr - arr.mean(axis=1,keepdims=True)

59. 如何按照第n列排序一个数组?(★★☆)

arr = np.array([[0,1,2],[1,1,1],[2,2,2]])
arr[arr[:,2].argsort()]
# argsort()返回的是数组中元素的索引,argsort()默认是升序排序

60. 如何判断一个给定的2D数组是否有空列?(★★☆)

arr = np.array([[1,2,3],[4,5,6],[7,8,np.nan]])
np.isnan(arr).any(axis=0)
# .any()相当于or的操作,加上axis=0,表示判断每一列

61. 在一个数组中找到最接近给定值的数(★★☆)

arr = np.array([4, 2, 9, 6, 10, 1])
target = 8
arr[(np.abs(arr-target)).argmin()]
# .argming()返回的是数组中最小元素的索引

62. 考虑两个形状分别为(1,3)和(3,1)的数组,如何使用迭代器计算它们的和?(★★☆)

# 定义两个数组
a = np.array([[1, 2, 3]])
b = np.array([[1], [2], [3]])

# 手动广播到共同形状
a_broadcasted, b_broadcasted = np.broadcast_arrays(a, b)
# np.broadcast_arrays()会返回输入数组的广播版本列表,这些返回的数组试图表面看似具有相同的形状

# 创建一个空数组用于存放结果,形状与广播后的数组相同
result = np.empty(a_broadcasted.shape, dtype=a_broadcasted.dtype)

# 使用迭代器逐元素计算和
it = np.nditer([a_broadcasted, b_broadcasted, result], [], [['readonly'], ['readonly'], ['writeonly', 'allocate']])
for x, y, z in it:
    z[...] = x + y

result

63. 创建一个具有name属性的数组类(★★☆)

class NamedArray(np.ndarray):
    def __new__(cls,input_array,name=''):
        # 使用__new__方法创建对象.因为np.darry是不可变的
        # 我们需要在对象被创建时设置
        obj = np.asarray(input_array).view(cls)
        obj.name = name
        return obj
    def __array_finalize__(self,obj):
        # __array_finalize__方法在对象被创建时被调用
        # 用来设置属性,这里确保name属性也会被复制
        if obj is None:
            return
        self.info = getattr(obj,'name', '')

64. 考虑一个给定的向量,如何给由第二个向量索引的每个元素加1(注意重复索引)?(★★★)

# 可以使用Numpy的'np.add.at'方法,这个方法允许对数组的特定索引执行就地操作,或直接修改原数组
# 当遇到重复索引时,会对每个重复的索引都进行操作

# 定义原始向量
v = np.array([1, 2, 3, 4, 5])

# 定义索引向量,可能包含重复的索引
i = np.array([0, 1, 2, 1, 3, 3, 4])

# 使用 np.add.at 对 v 的指定索引进行加 1 操作
np.add.at(v, i, 1)

print(v)

65. 如何根据索引列表(I)将向量(X)的元素累加到一个数组(F)中?(★★★)

# 同样使用np.add.at方法,这个方法允许对数组的特定索引执行就地操作,或直接修改原数组

# 定义向量 X
X = np.array([1.1, 2.2, 3.3, 4.4, 5.5])

# 定义索引列表 I
I = np.array([0, 1, 2, 1, 3])

# 定义目标数组 F,假设我们想要累加到的数组有 5 个元素,初始化为 0
F = np.zeros(5)

# 使用 np.add.at 根据索引 I 将 X 的元素累加到 F 中
np.add.at(F, I, X)

print(F)

66. 考虑一个(w,h,3)形状的图像(dtype=ubyte),计算唯一颜色的数量(★★☆)

# 假设 img 是一个 (w,h,3) 形状的图像数组,这里使用随机数据来模拟一个图像
w, h = 100, 100  # 图像的宽度和高度
img = np.random.randint(0, 256, size=(w, h, 3), dtype=np.ubyte)  # 生成一个模拟图像

# 将图像数组重塑为 (w*h, 3)
reshaped_img = img.reshape((-1, 3))

# 将重塑后的数组视为含有多个字段的结构化数组,使 np.unique 能按三元组处理
unique_colors = np.unique(reshaped_img.view([('', reshaped_img.dtype)]*3), axis=0)

# 计算唯一颜色的数量
num_unique_colors = unique_colors.shape[0]

print("Number of unique colors:", num_unique_colors)

67. 考虑一个四维数组,如何一次性获得最后两轴的和?(★★★)

# 创建一个四维数组
arr = np.arange(48).reshape((2, 3, 4, 2))

# 计算最后两个轴的和
sum_last_two_axes = np.sum(arr, axis=(-2, -1))

print(sum_last_two_axes)

68. 考虑一维向量D,如何使用描述子集索引的同大小向量S来计算D的子集均值?(★★★)

# 使用布尔索引 D[S] 来选择向量 D 中与 S 中对应为 True 的元素。然后,我们使用 np.mean 函数计算所选子集的平均值。
D = np.array([1, 2, 3, 4, 5])
S = np.array([True, False, True, False, True])

subset_mean = np.mean(D[S])

print(subset_mean)

69. 如何获得点积的对角线?(★★★)

# 可以使用 NumPy 的 np.einsum 函数来计算两个数组的点积,并同时获取点积结果的对角线。
# 创建两个数组
a = np.array([[1, 2, 3],
              [4, 5, 6]])

b = np.array([[7, 8],
              [9, 10],
              [11, 12]])

# 计算点积并获取对角线
dot_product_diagonal = np.einsum('ij,ji->i', a, b)

print(dot_product_diagonal)

70. 考虑向量[1, 2, 3, 4, 5],如何构建一个新向量,在每个值之间插入3个连续的零?(★★★)

# 使用 np.insert 函数将 zero_vector 插入到原始向量的特定位置。我们使用 np.arange(1, len(original_vector) + 1) * 4 - 1 来生成要插入的位置索引,这样就能在每个原始值之后插入 3 个连续的零。
# 原始向量
original_vector = np.array([1, 2, 3, 4, 5])

# 零向量
zero_vector = np.zeros(3 * len(original_vector))

# 构建新向量
new_vector = np.insert(original_vector, np.arange(1, len(original_vector) + 1) * 4 - 1, zero_vector)

print(new_vector)

71. 考虑一个维度为(5,5,3)的数组,如何将其乘以一个维度为(5,5)的数组?(★★★)

# 使用广播功能,将维度为 (5,5) 的数组 arr_2d 扩展为维度为 (5,5,1) 的数组,以便与维度为 (5,5,3) 的数组 arr_3d 进行逐元素乘法。这是通过 arr_2d[:, :, np.newaxis] 实现的。
# 创建一个维度为 (5,5,3) 的数组
arr_3d = np.random.randint(1, 10, size=(5, 5, 3))

# 创建一个维度为 (5,5) 的数组
arr_2d = np.random.randint(1, 5, size=(5, 5))

# 对数组进行乘法运算
result = arr_3d * arr_2d[:, :, np.newaxis]

print(result)

72. 如何交换数组的两行?(★★★)

# 可以通过直接交换行的索引来实现
# 创建一个数组
arr = np.arange(25).reshape((5, 5))

# 交换第一行和第三行
arr[[0, 2]] = arr[[2, 0]]

print(arr)

73. 考虑一组描述10个三角形(具有共享顶点)的10个三元组,找到组成所有三角形的唯一线段集(★★★)

# 假设 triangles 是一个包含 10 个三元组的数组,每个三元组代表一个三角形的三个顶点
# 这里用随机数据生成一个示例
np.random.seed(0)  # 保证可重复性
triangles = np.random.randint(1, 100, (10, 3))

# 生成线段
# 每个三角形由三个顶点组成,因此有三个线段:(v1, v2), (v2, v3), (v1, v3)
segments = np.vstack([triangles[:, [0, 1]], triangles[:, [1, 2]], triangles[:, [0, 2]]])

# 标准化线段,确保每个线段的起点小于终点
segments = np.sort(segments, axis=1)

# 去除重复的线段
unique_segments = np.unique(segments, axis=0)

print("Unique segments:")
print(unique_segments)

74. 给定一个对应于bincount的排序数组C,如何产生一个数组A使得np.bincount(A) == C?(★★★)

# bincount用来计算整数数组中各个元素的频率
# 给定的排序数组 C,表示 np.bincount 的结果
C = np.array([0, 2, 1, 0, 4])

# 产生数组 A
A = np.repeat(np.arange(len(C)), C)

print("Generated Array A:", A)

75. 如何使用数组上的滑动窗口计算平均值?(★★★)

#首先定义了一个简单的数组 a 和一个窗口大小 N。然后,我们创建了一个均匀的权重数组 window,其所有元素之和为 1。最后,我们通过 np.convolve 函数与这个窗口进行卷积,计算滑动平均值。
# 示例数组
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 窗口大小
N = 3

# 创建一个等于滑动窗口大小的均匀权重数组
window = np.ones(N) / N

# 计算滑动平均值
# mode='valid' 意味着只计算完全覆盖数组的窗口位置
# 这会导致输出数组的大小比输入数组小
moving_average = np.convolve(a, window, mode='valid')

print(moving_average)

后续会更行全部100题,欢迎关注

以上

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/465556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chatGLM3+chatchat实现本地知识库

背景 由于客服存在大量的问题为FAQ问题,需要精准回复客户,所以针对此类精准问题,通过自建同量数量库进行回复。 落地方案 通过chatGLM3-6Blangchain-chatchatbge-large-zh实现本地知识库库。 注意:相关介绍和说明请看官网~ 配置要…

【解读】NIST网络安全框架CSF 2.0

2014年,NIST(美国国家标准与技术研究所,类似于中国的工信部)首次发布了网络安全框架CSF(Cybersecurity Framework),十年后,在2024年2月26日发布了重大更新(CSF 2.0)&…

C++初阶:string的使用与STL

目录 1. C标准库与STL2. string是什么3. string的使用3.1 构造与拷贝构造3.2 遍历访问方式3.3 STL中算法操作相关内容3.4 容量相关成员函数3.5 内容修改相关成员函数3.6 string类操作成员函数3.7 string的非成员函数 1. C标准库与STL 编程语言标准库中,有着许多基础…

wps技巧二实现每一行文字后面统一添加数据

效果 操作 查找,输入^p 替换,输入 n m p q^p,测试数据,随意替换成你想要的 结果

MySQL-- B+ 树

一、InnoDB 是如何存储数据的? InnoDB 的数据是按「数据页」为单位来读写的 数据库的 I/O 操作的最小单位是页,InnoDB 数据页的默认大小是 16KB 单个数据页的结构及作用 多个数据页之间的逻辑连接(双向链表),不需要物…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过(CVE-2017-8386)导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突,将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指…

固态硬盘有缓存和没缓存有什么区别

固态硬盘(SSD)已经成为现代计算机的重要组成部分,它们提供了比传统机械硬盘更快的读写速度,从而显著提升了操作系统的运行速度和应用程序的加载效率。 其中,缓存(Cache)是固态硬盘中一个重要的…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

ROS2从入门到精通1-1:详解ROS2话题通信机制与自定义消息

目录 0 专栏介绍1 话题通信模型2 话题模型实现(C)3 话题模型实现(Python)4 自定义消息 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情&a…

【最新版源码】快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4…

CoAP计算机协议,应用于物联网

什么是CoAP协议? CoAP(Constrained Application Protocol,受限应用协议)是一种专为物联网(IoT)设备和资源受限网络设计的应用层协议。它的诞生也是由于物联网设备大多都是资源限制型的,比如 CP…

【GPT-SOVITS-02】GPT模块解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

Java之SpringBoot基础夯实——八股文【2024面试题案例代码】

1、什么是 Spring Boot? Spring Boot 是一个开源的Java开发框架,由Pivotal团队开发,其核心目标是简化新Spring应用的初始搭建和开发流程。它以Spring框架为基础,通过自动配置和约定优于配置的原则,极大程度地减少了手…

HarmonyOS(鸿蒙)ArkUI组件

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

嵌入式学习之Linux系统编程篇笔记——系统编程初探

配套视频学习链接:https://www.bilibili.com/video/BV1zV411e7Cy?p2&vd_sourced488bc722b90657aaa06a1e8647eddfc 目录 Linux系统编程的基本认识 什么是Linux系统编程? 什么是系统编程 系统编程的作用 怎么学习Linux系统编程? Linux系统编程基本程序框…

马斯克大模型Grok-1已开源,目前为止最大的开源大语言模型

🦉 AI新闻 🚀 马斯克大模型Grok-1已开源,目前为止最大的开源大语言模型 摘要:马斯克上一周就在x上预告将开源自己的大模型,等了一周,就在刚刚,马斯克的大模型 Grok-1 开源了,Grok-…

【Canvas与艺术】砂落字现

【注意】 本作代码需要在服务器端执行,不可用浏览器直接打开运行。 如何安装服务器端请参考:https://www.cnblogs.com/heyang78/p/3339235.html 【原理】 雨粒子落下时,如果当前点不是黑点,则化身为金字的一个像素点。 【效果…

USB - USB Gadget on Linux

February, 2012. Embedded Linux Conference 2012. Agenda Introduction to USB USB Gadget API Existing Gadgets Design your own Gadget Demo Conclusio About the Author Software engineer at Adeneo Embedded Linux, Android Main activities: – BSP adaptation – Driv…

PXVDI企业级PVE免费桌面虚拟化部署教程ProxmoxVE

什么是PXVDI? PXVDI是一款基于Proxmox VE为底层的可商用的免费云桌面套件。对熟悉PVE的人来说,这点非常的点赞。首先是PVE是免费的,其次PVE的免费云桌面方案也极为少数。 根据官方提出的价格清单,免费版和商业版在功能上主要的区…
最新文章