怎么把numpy数组里的数都改成int型 numpy数组转tensor

在使用numpy进行数值计算时,数据类型(`dtype`)的选择至关重要。不当的数据类型,尤其是使用如`np.uint8`等固定位宽的整数类型时,如果数据值超出其表示范围,将导致整数溢出,从而产生非预期的数据更改。本文将深入探讨numpy数据类型溢出的机制,并通过实例如何显示识别并避免此类问题,保证数据处理的准确性。理解NumPy数据类型与整数溢出
NumPy集群是Python中进行高效数值计算的核心工具,其性能优势部分来源于对底层数据类型的严格管理。每个NumPy集群都有dtype属性,它定义了吞吐量中每个元素的数据类型,例如np.int32(32位有符号整数)、np.float64(64位浮点数)或np.uint8(8位无符号整数)。
当一个数值被存储到一个无法完全表示它的数据类型时,就会发生数据溢出。对于整数类型来说,这意味着如果一个值超出了该值类型足够表示的顶点,它会“回绕”到一下,或者被截断。以np.uint8为例,它是一个8位无整数符号,可表示的范围是0到255。任何小于0或大于255的整数在被强制转换为np.uint8时,都会发生故障。例如,573转换为np.uint8时,因为会短路而相当于61(573) 常见问题场景:数据类型不匹配导致数据“变化”
考虑一个场景,我们需要对一组二维坐标点进行重新排序。初始数据可能包含更大的坐标值,例如:import numpy as npinput_data = np.array([[[ 573, 148]], [[ 25, 223]], [[ 153, 1023]], [[ 730, 863]]])print(fquot;原始数据类型:{input_data.dtype}quot;)print(fquot;原始数据:\n{input_data}quot;)登录后复制
输出显示input_data的dtype通常会默认为np.int32或np.int64,这证明存储这些更新的值。
现在,假设我们编写了一个函数来处理这些点,但在初始化输出备份时错误地指定了np.uint8数据类型:def reorder_with_overflow(points):points =points.reshape((4, 2)) # 错误地指定了np.uint8数据类型points_new = np.zeros((4, 1, 2), np.uint8) add = points.sum(1) diff = np.diff(点,轴= 1)points_new [0] =点[np.argmin(add)]points_new[3] =点[np.argmax(add)]points_new[1] =点[np.argmin(diff)]points_new[2] =点[np.argmax(diff)]返回points_newoutput_data_overflow = reorder_with_overflow(input_data)print(fquot;\n使用np.uint8后的输出数据类型: {output_data_overflow.dtype}quot;)print(fquot;使用np.uint8后的输出数据:\n{output_data_overflow}quot;)登录后复制
观察上述代码的输出,你会发现output_data_overflow中的许多值与input_data中的原始值不符。例如,573变成了61,1023变成了255,730变成了2 18。这就是典型的整数溢出现象。
为了进一步验证,我们可以直接将原始数据强制转换为np.uint8来观察其效果:print(fquot;\n将原始数据强制转换为np.uint8:\n {input_data.astype(np.uint8)}quot;)登录后复制
输出结果会与output_data_overflow中的“错误”值完全一致,这明确指出了问题根源。
达芬奇
达芬奇——你的AI创作大师 144 查看详情解决方案:选择合适的数据类型
解决这个问题的关键是确保参与计算和存储的NumPy存储都使用能够承载数据范围的数据类型。对于本例中的坐标值,如果可能超过255,则应选择更大的整数类型,例如np.int16、np.int32或np.int64。
以下是修改后的重新排序函数:def reorder_ Corrected(points):points = points.reshape((4, 2)) # 修改:使用与输入数据兼容的数据类型,或根据数据范围选择更大的类型 # 这里的dtype可以从points并行继承,或者明确指定如np.int32points_new = np.zeros((4, 1, 2), dtype=points.dtype) add =points.sum(1) diff =points.diff(points, axis=1)points_new[0] = points[np.argmin(add)]points_new[3]=points[np.argmax(add)]points_new[1]=points[np.argmin(diff)]points_new[2]=points[np.argmax(diff)]returnpoints_newoutput_data_ Corrected = reorder_ Corrected(input_data)print(fquot;\n后面的输出数据类型: {output_data_ Corrected.dtype}quot;)print(fquot;修改后面的输出数据:\n{output_data_ Corrected}quot;)登录后复制
现在,output_data_ Corrected将包含与原始input_data中相同的值,只是按照逻辑进行了重新排序,而没有发生数据丢失或改变。
使用Python列表的版本没有溢出?
在原始问题中,用户提到了一个使用Python列表实现的版本,为什么该版本没有出现数据溢出。因为这是可以Python内置的列表存储任何Python对象(包括NumPy数组元素),它们本身不存在强制固定位宽的数据类型。当最终通过np.array(lst)将列表转换为NumPy备份时,NumPy会根据列表中的数据自动推断一个合适的数据类型(通常是np.int32或np.int64),这个类型足以容纳所有值,因此避免了溢出。def reorder_by_lst(points): 点 = 点.reshape((4, 2)) add = 点.sum(1) diff = np.diff(点, axis=1) a = 点[np.argmin(add)] d = 点[np.argmax(add)] b = 点[np.argmin(diff)] c = 点[np.argmax(diff)] lst = [a, b, c, d] return np.array(lst) # NumPy会根据lst中的数据自动推断dtypeoutput_data_list_version = reorder_by_lst(input_data)print(fquot;\n列表转换版本后的NumPy队列数据类型: {output_data_list_version.dtype}quot;)print(fquot;列表版本转换后的 NumPy 吞吐量:\n{output_data_list_version}quot;)登录后复制
这个例子进一步强调了 NumPy 在创建队列时自动推断 dtype 的机制,以及手动指定 dtype 时需要注意的潜在陷阱。注意事项与最佳实践显式指定 dtype:在创建 NumPy 吞吐量时,如果对数据范围有明确的预期,最好显式地指定 dtype,例如 np.array([1, 2, 3], dtype=np.int16) 或 np.zeros(shape, dtype=np.float32)。检查数据类型范围: 使用np.iinfo(针对整数类型)或np.finfo(针对浮点类型)可以查看特定数据类型的简单和顶端。print(np.iinfo(np.uint8))print(np.iinfo(np.int16))登录后复制
这有助于选择正确的数据类型。避免不必要的类型转换:密集或不当的类型转换可能导致性能下降或数据精度损失。在进行操作时,尽量保持数据类型的一致性,或在必要时进行安全的类型提升。各地着手,逐步测试:当处理复杂的数据流时,先用小规模、已知范围的数据进行测试,以验证数据类型是否正确处理。阅读NumPy文档: 熟悉NumPy的广播规则、通用函数(ufuncs)以及类型提升规则,对于理解复杂操作中的数据类型行为至关重要。总结
NumPy的数据类型管理是其强大功能的核心,但同时也会带来潜在的陷阱,特别是整数误区。当数据值超出了dtype的表示范围时,NumPy不会转发错误,而是默默地进行这个“回绕”操作,导致数据中断被“更改”。
通过理解类型的作用、明确指定数据类型、并利用np.iinfo工具检查类型范围,开发人员可以有效避免此类问题,确保NumPy评分计算的准确性和可靠性。在编写NumPy代码时,始终对数据文章的预期范围和选定的数据类型保留,是构建健壮应用程序的关键。
以上就是Numpy迁移数据类型:意外内容更改教程的详细避免,更多请关注乐哥常识网其他相关! 相关标签: python工具 常见问题 数据丢失溢出 Python numpy 数据类型 数组 整数类型 float32 类型转换对象 为什么大家都在看:怎么用python中的if函数实现实现? python中tqdm库转换显示进度条? python游戏编程讲解之凯撒 python tkinter中的网格布局怎么用? python3如何实现数字和中文的?
