首 页IT知识库收藏内容
当前位置:翔宇亭IT乐园IT知识库Numpy

NumPy 数组数据类型的转换

减小字体 增大字体 作者:本站  来源:本站整理  发布时间:2025-07-31 07:19:06

NumPy提供了几种方法来实现数组数据类型的转换,允许用户在不修改相关值的情况下来改变数据的存储方式。

运用astype()方法

astype是NumPy常用的数组数据类型转换方式,该方法创建数组的一个副本,并强制将数据转换为指定的数据类型。

下例中使用NumPy的astype()方法将一个整型数组转换为一个浮点类型数组。

import numpy as np

# 创建一个整型NumPy数组
arr = np.array([1, 2, 3, 4, 5])
print("原数组:", arr)
print("原数据类型dtype:", arr.dtype)

# 将数组转换为浮点类型
arr_float = arr.astype(np.float32)
print("转换后的数组:", arr_float)
print("转换后的数据类型dtype:", arr_float.dtype)

输出结果如下所示:

原数组: [1 2 3 4 5]
原数据类型dtype: int32
转换后的数组: [1. 2. 3. 4. 5.]
转换后的数据类型dtype: float32

使用numpy中的类型函数

NumPy中提供了一些函数实现数组数据类型的转换,这些函数尽管不常用,但在某些情况下很方便。

下面例子中演示了一些使用NumPy中的相关函数进行数组类型转换的例子。

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print("原数组arr:", arr, "原数组类型:", arr.dtype)
arr1 = np.float32(arr)
print("转换成float32:", arr1, "arr1数据类型:", arr1.dtype)
arr2 = np.complex64(arr)
print("转换成complex64:",arr2, "arr2数据类型:", arr2.dtype)
arr3 = np.cast['float64'](arr)
print("转换成float64:",arr3, "arr3数据类型:", arr3.dtype)

输出结果如下:

原数组arr: [1 2 3 4 5] 原数组类型: int32
转换成float32: [1. 2. 3. 4. 5.] arr1数据类型: float32
转换成complex64: [1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j] arr2数据类型: complex64
转换成float64: [1. 2. 3. 4. 5.] arr3数据类型: float64

直接进行数据转换

下面的例子在定义数组时,直接指定数据类型。

import numpy as np
arr = np.array([1, 2, 3, 4, 5], dtype=np.float32)
print("数组:", arr)
print("数据类型:", arr.dtype)

输出结果如下:

数组: [1. 2. 3. 4. 5.]
数据类型: float32

在该例中,定义数组时给定的元素序列为整数型,指定的dtype参数为float32,则最终定义的数组为32位的浮点类型。

由数字构成的字符串类型数组也可以转换成相应的数值标量类型。

import numpy as np
arr = np.array(['1.1', '1.2', '1.3'], dtype=np.float32)
print('数组:', arr)
print('数据类型:', arr.dtype)

输出结果如下:

数组: [1.1 1.2 1.3]
数据类型: float32

这种数据类型转换方式需要待转换的数据类型能够转换成目的数据类型,否则会报错。

不可进行转换的几种情境

在NumPy数组数据类型转换过程中可能会遇到无法完成转换的情况,并给出错误异常或者非期望的行为。

本部分将探讨无法完成数据类型转换的几种情形。

(1)非数字类型字符串转换为数字类型时

如果待转换的字符串是非数字字符串,在转换整型或浮点类型时,NumPy会抛出ValueError异常。

import numpy as np
# 创建包含非数字字符串的数组
arr = np.array(['1.1', '1.2', '1.3', 'four'])
# 输出原数组的相关信息
print('原数组:', arr, '\t原数组类型:', arr.dtype)

try:
    arr_float = arr.astype(np.float32)
    print('转换后的数组:', arr_float, '\t转换后的类型:', arr_float.dtype)
except ValueError as e:
    print('错误信息:', e)

输出结果信息如下:

原数组: ['1.1' '1.2' '1.3' 'four'] 原数组类型: <U4
错误信息: could not convert string to float: 'four'

在数据类型转换时,常常因无法实现转换而抛出错误,为了更加友好的处理这一问题,可以借助Python的异常处理方法来处理可能遇到的问题。

在该例中,原数组arr中的'four'无法被转换为浮点类型,导致程序抛出ValueError错误,并被Except块捕捉到,并输出相应的错误信息。

(2)转换时存在数据溢出

如果待转换的数据超出目标数据类型的存储范围,会导致程序出现OverflowError错误或意想不到的输出结果。

下面例子定义了一个整型数组,(默认为int32),程序中企图将其转换为int8。

import numpy as np
# 创建一个整型数组
arr = np.array([127, 128, 129, 130])
# 输出原数组的相关信息
print('原数组:', arr, '\t原数组类型:', arr.dtype)

try:
    arr_int8 = arr.astype(np.int8)
    print('转换后的数组:', arr_int8, '\t转换后的类型:', arr_int8.dtype)
except OverflowError as e:
    print('错误信息:', e)

输出结果如下:

原数组: [127 128 129 130]    原数组类型: int32
转换后的数组: [ 127 -128 -127 -126]    转换后的类型: int8

上面程序在Jupyter中(Version 7.2.2)以及Python自带的IDLE编辑器中(3.11.3)都不会报错,但输出的结果并非意料中的结果。由于溢出,转换后的数组元素并非所期望的值。

(3)将复数类型转换为实数类型时

在将一个复数类型数组转换为一个实数类型数组时,NumPy会丢弃复数的虚部部分,并给出一个ComplexWarning警告错误。

import numpy as np

# 创建一个复数数组
c_arr = np.array([1+2j, 3+4j, 5+6j])
print('原数组:', c_arr, '\t原数组类型:', c_arr.dtype)

# 将原数组转换为float类型
float_arr = c_arr.astype(np.float32)
print('转换后的数组:', float_arr, '转换后的数据类型:', float_arr.dtype)

在Python自带的IDLE 3.11.3中的输出结果为:

原数组: [1.+2.j 3.+4.j 5.+6.j] 原数组类型: complex128
Warning (from warnings module):
    File "D:\temp\numpy_data_type_convert.py", line 8
       float_arr = c_arr.astype(np.float32)
ComplexWarning: Casting complex values to real discards the imaginary part
转换后的数组: [1. 3. 5.] 转换后的数据类型: float32

在Jupyter中的结果形式如下:

原数组: [1.+2.j 3.+4.j 5.+6.j] 原数组类型: complex128
转换后的数组: [1. 3. 5.] 转换后的数据类型: float32
ComplexWarning: Casting complex values to real discards the imaginary part float_arr = c_arr.astype(np.float32)

由输出结果可知,将复数类型转换为实数类型时,复数的虚部被舍弃,并给出了ComplexWarning警告错误。

转换失败时的处理

除了上面使用try-except模块处理可能遇到的问题外,在实际中,还需要对转换失败的数据进行相应的处理。

在实际数据处理过程中,数据转换失败并不意味着就要放弃处理过程,而是需要想办法对转换失败的数据进行相应的处理。

这里给出一个将其替换为np.nan值的方法,nan即 Not a Number(不是一个数字)。这对处理缺失值非常有用。

import numpy as np

arr = np.array(['1.1', '1.2', '1.3', 'four'])
print("原数组:", arr, "原数组类型:", arr.dtype)

# 定义一个函数来处理原数组中的每个元素
def convert_with_nan(arr):
    result = []
    for item in arr:
    try:
        result.append(float(item))
    except ValueError:
        result.append(np.nan)
    return np.array(result)

# 调用函数进行处理
arr_float = convert_with_nan(arr)
print("转换后的数组:", arr_float, '转换后的类型:', arr_float.dtype)

输出结果为:

原数组: ['1.1' '1.2' '1.3' 'four'] 原数组类型: <U4
转换后的数组: [1.1 1.2 1.3 nan] 转换后的类型: float64

从这个例子中可以看出,经过这样的处理可以将原数组中不能进行转换的数据元素替换为np.nan。

微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。

个人成长离不开各位的关注,你的关注就是我继续前行的动力。

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
愿您的精彩评论引起共鸣,带来思考和价值。
用户名: 查看更多评论
分 值:100分 90分 80分 70分 60分 40分 20分
内 容:
验证码:
关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图
本站部分内容来自互联网,如有侵权,请来信告之,谢谢!
Copyright © 2007-2024 biye5u.com. All Rights Reserved.