python 整形数组转化为float数组
在Python中,如果你有一个整数数组(通常由list
表示),想要将其转换为浮点数数组,你可以通过将每个元素都强制转换为float
来实现。下面是一个简单的例子:
# 假设我们有以下整数数组
int_array = [1, 2, 3, 4, 5]
# 转换为浮点数数组
float_array = [float(num) for num in int_array]
print(float_array)
运行这段代码后,float_array
就会包含所有整数元素作为浮点数。注意,如果列表中有不能转换为浮点数的元素(如字符串或其他非数字类型的值),这将会引发ValueError
异常。
任务1:创建数组 用三种不同方法创建以下数组(要求使用numpy方法): a)从列表创建:[[11,2.3],[4,5,6]] b)创建3x3的全1数组,数据美型为int8 c) 创建从10到50(包含50),步长为5的一维数组 任务2:数据类型转换 a)将任务1a创建的数组转换为float32美型 D)创建一个包含[0.5,1.7,2.9]的数组,然后将其元素强制转换为型数 任务3:随机数生成 生成包含10个0-100之间随机醛数的数组
任务1:创建数组
a) 从列表创建:[[11, 2.3], [4, 5, 6]]
可以使用 numpy.array()
函数直接将 Python 列表转换为 NumPy 数组。
import numpy as np
# 方法一:直接从列表创建
arr_a = np.array([[11, 2.3], [4, 5, 6]])
print("方法一 (直接从列表):", arr_a)
# 方法二:通过元组嵌套的方式创建
list_tuple = ((11, 2.3), (4, 5, 6))
arr_a_2 = np.array(list_tuple)
print("方法二 (从元组):", arr_a_2)
# 方法三:先创建空数组再赋值
empty_arr = np.empty((2, 3)) # 预留空间
empty_arr[0] = [11, 2.3, None] # 替换第一行,注意None会引发警告
empty_arr[1] = [4, 5, 6] # 第二行正常填充
print("方法三 (预留+替换):", empty_arr[:2, :2]) # 打印有效部分
b) 创建 3x3 的全 1 数组,数据类型为 int8
利用 np.ones()
和指定的数据类型完成。
# 方法一:使用 ones() 并设置 dtype=int8
arr_b = np.ones((3, 3), dtype=np.int8)
print("方法一 (ones + int8):", arr_b)
# 方法二:先创建二维浮点数矩阵再转换成整型
temp_float_array = np.ones((3, 3))
arr_b_2 = temp_float_array.astype(np.int8)
print("方法二 (astype 转换):", arr_b_2)
# 方法三:使用 full()
arr_b_3 = np.full((3, 3), 1, dtype=np.int8)
print("方法三 (full):", arr_b_3)
c) 创建从 10 到 50(包含 50),步长为 5 的一维数组
可以用 np.arange(start, stop, step)
来快速生成等差序列。
# 方法一:arange 默认生成 float 类型数值
arr_c = np.arange(10, 51, 5) # 注意终点需要加一步覆盖 50
print("方法一 (arange):", arr_c)
# 方法二:linspace 分割范围并调整边界条件
arr_c_2 = np.linspace(10, 50, num=9).astype(int) # 确保有正确的步长对应关系
print("方法二 (linspace):", arr_c_2)
# 方法三:手动构建列表后再转为 ndarray
manual_list = list(range(10, 51, 5))
arr_c_3 = np.array(manual_list)
print("方法三 (range -> array):", arr_c_3)
任务2:数据类型转换
a) 将任务 1a 中的数组转换为 float32
数据类型
首先需要回顾刚才的任务 1a 结果:
converted_arr_a = arr_a.astype(np.float32)
print("任务1a 转换成 float32:", converted_arr_a)
d) 创建 [0.5, 1.7, 2.9]
的数组,并将其元素强制转换为整数
我们可以在创建之后立刻应用 .astype()
强制改变类型。
# 步骤一:创建原数组
original_floats = np.array([0.5, 1.7, 2.9])
# 步骤二:转换成整形
int_converted = original_floats.astype(int)
print("原始数组:", original_floats)
print("强制转化后的数组:", int_converted)
说明: 当浮点数转化为整数时,NumPy 采用截断法丢弃小数位而不是四舍五入!
任务3:随机数生成
目标是生成一个包含 10 个 0~100 范围内的均匀分布随机整数的数组。以下是几种常用的方法。
# 方法一:random.randint(low, high, size)
rand_integers_1 = np.random.randint(0, 101, size=(10,))
print("方法一 (randint):", rand_integers_1)
# 方法二:uniform 模拟离散采样
uniform_random = np.random.uniform(0, 100, size=10).round().astype(int)
print("方法二 (uniform -> round):", uniform_random)
# 方法三:seed 控制伪随机化以便复现结果
np.random.seed(42)
fixed_rand = np.random.choice(range(101), size=10, replace=True)
print("方法三 (固定种子):", fixed_rand)
总结
以上介绍了如何用三种不同方式分别完成任务的要求。每种方法各有优劣,在实际场景可以根据需求选择最合适的解决方案。
# 去遍历图片,进行计数 for path, im, im0s, vid_cap, s in dataset: ''' 在dataset中,每次迭代的返回值是self.sources, img, img0, None, '' path:文件路径(即source) im: resize后的图片(经过了放缩操作) im0s: 原始图片 vid_cap=none s: 图片的基本信息,比如路径,大小 ''' with dt[0]: im = torch.from_numpy(im).to(model.device) # 将图片放到指定设备(如GPU)上识别。#torch.size=[3640,480] im = im.half() if model.fp16 else im.float() # uint8 to fp16/32 把输入从整形转化为半精度/全精度浮点数。 im /= 255 # 0 - 255 to 0.0 - 1.0 归一化,所有像素点除以255 if len(im.shape) == 3: im = im[None] # expand for batch dim 添加一个第0维。缺少batch这个尺寸,所以将其扩充成[1,3640,480] if model.xml and im.shape[0] > 1: ims = torch.chunk(im, im.shape[0], 0) # Inference with dt[1]: visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False if model.xml and im.shape[0] > 1: pred = None for image in ims: if pred is None: pred = model(image, augment=augment, visualize=visualize).unsqueeze(0) else: pred = torch.cat((pred, model(image, augment=augment, visualize=visualize).unsqueeze(0)), dim=0) pred = [pred, None] else: pred = model(im, augment=augment, visualize=visualize) # NMS with dt[2]: pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)帮我竹行注释
首先看循环部分:for循环遍历dataset,每次获取path、im、im0s等变量。用户已经给出了一些注释,可能需要进一步明确每个变量的作用,比如im是resize后的图片,而im0s是原始图片。接下来是数据处理部分,用torch.from_numpy将图像转换为张量,并移动到指定设备。这里要注意half和float的转换,以及归一化到0-1之间。如果输入维度是3,就扩展成4维,添加batch维度,因为模型通常需要batch输入。
然后是模型推理部分,分为XML模型处理和非XML的情况。用户提到的model.xml可能是指某种模型结构,需要分批次处理。这里可能需要注释model.xml的作用,以及为什么当batch大于1时要拆分处理。visualize参数可能用于保存可视化结果,increment_path生成唯一的保存路径。
NMS部分使用non_max_suppression函数,用户可能需要解释参数的含义,比如conf_thres是置信度阈值,iou_thres是IoU阈值,classes指定要保留的类别等。另外,时间统计dt的作用,比如dt[0]、dt[1]、dt[2]可能分别记录预处理、推理、NMS的时间。
要注意代码中的条件判断,比如model.xml的情况,可能需要说明模型是否需要分块处理。还有pred的拼接过程,使用torch.cat来合并预测结果。最后,注释需要简明扼要,解释每一行代码的作用和目的,帮助用户理解整个检测流程。
可能用户是刚开始学习YOLO或目标检测,需要详细的代码解释来理解处理流程。需要确保注释准确,特别是张量形状的变化、设备转移、归一化处理等步骤。同时,用户可能对模型推理和NMS的具体实现不太熟悉,需要适当说明这些步骤的意义。另外,变量如visualize和increment_path的作用也需要解释清楚,帮助用户了解如何保存结果。我来为您逐行解释这段基于YOLO的图片遍历检测代码:
# 遍历数据集中的每张图片
for path, im, im0s, vid_cap, s in dataset:
'''
path:图片/视频的源路径,如:'../zidane.jpg'
im: 预处理后的图片张量(已缩放)
im0s: 原始图片(未缩放)
vid_cap: 视频捕获对象(处理图片时为None)
s: 包含图片元信息的字符串,如:'image 1/1: 640x480...'
'''
# [预处理阶段] 计时开始
with dt[0]:
# 将numpy数组转换为PyTorch张量,并转移到指定设备(如GPU)
im = torch.from_numpy(im).to(model.device) # 示例形状:[3640, 480, 3]
# 精度转换:半精度(half)或全精度(float)
im = im.half() if model.fp16 else im.float() # 通常FP16用于加速推理
# 归一化:将像素值从0-255缩放到0.0-1.0
im /= 255 # 深度学习模型的常见预处理
# 添加批次维度(如果输入是单张图片)
if len(im.shape) == 3: # 原形状 [H, W, C]
im = im[None] # 新形状 [1, H, W, C]
# 处理特殊模型结构(如分块检测模型)
if model.xml and im.shape[0] > 1:
ims = torch.chunk(im, im.shape[0], 0) # 将批次拆分为单个张量
# [推理阶段] 计时开始
with dt[1]:
# 创建可视化路径(如果需要生成检测结果可视化图)
visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False
# 执行模型推理
if model.xml and im.shape[0] > 1:
pred = None
# 分块处理输入
for image in ims:
# 执行模型前向传播,unsqueeze(0)添加批次维度
current_pred = model(image, augment=augment, visualize=visualize).unsqueeze(0)
pred = torch.cat((pred, current_pred), dim=0) if pred is not None else current_pred
pred = [pred, None] # 保持输出格式统一
else:
# 常规推理流程
pred = model(im, augment=augment, visualize=visualize)
# [非极大值抑制阶段] 计时开始
with dt[2]:
# 执行非极大值抑制过滤冗余检测框
pred = non_max_suppression(
pred, # 原始预测结果
conf_thres=conf_thres, # 置信度阈值(如0.25)
iou_thres=iou_thres, # IoU阈值(如0.45)
classes=classes, # 指定保留的类别ID
agnostic_nms=agnostic_nms, # 是否使用类别无关NMS
max_det=max_det # 每张图最大检测数(如100)
)
主要功能说明:
- 输入预处理:完成数据类型转换(numpy→tensor)、精度转换(FP32/FP16)、归一化(0-1范围)、添加批次维度
- 模型推理:根据模型类型选择分块处理或常规推理,支持数据增强和结果可视化
- 后处理:通过NMS算法过滤重叠检测框,保留最可信的预测结果
时间统计说明:
dt[0]
记录预处理耗时dt[1]
记录模型推理耗时dt[2]
记录NMS后处理耗时
实际应用场景:目标检测系统中的典型处理流程,常用于视频监控、自动驾驶、工业质检等需要实时检测的领域。
相关推荐







