我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在通过numpyndarray类型变量,分析各种科学数据的时候,经常会看到U10<U5i5>i4之类的奇怪表述。它们实际上是ndarraydtype,也就是数组的子元素类型。在本文中,苏南大叔会对dtype做简要的初步分析。

苏南大叔:初步分析ndarray类型变量的dtype属性,U10表示什么意思? - ndarray-dtype
初步分析ndarray类型变量的dtype属性,U10表示什么意思?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:win10python@3.12.0numpy@1.26.1

初步认识 dtype

在以前的文字中,苏南大叔曾经表示过:ndarray这个数据类型的一些行为非常奇怪,和list类型的类似行为相比,区别很大。参考文字:

这是因为:
默认情况下,ndarray的元素都有个默认统一的dtype(当然也可以有不同的dtype),它规定了ndarray类型变量的元素的数据类型、长度以及存储方式等信息。

import numpy as np
s = np.array([1,2,3])             # int32
n = np.array(["1","201","304"])   # <U3
o = np.array([1,"2",3,True])      # <U11
k = np.array([1,2,3,True])        # int32
a = np.array([1.0,2.02,3.03])     # float64
print(s.dtype,n.dtype,o.dtype,k.dtype,a.dtype) # int32 <U3 <U11 int32 float64

设置 dtype

在生成一个新的ndarray类型变量后,可以直接设置普通的dtype

import numpy as np
s = np.array([1,2,3],dtype='U15')
n = np.array(["1","201","304"],dtype='U15')
o = np.array([1,"2",3,True],dtype='U15')
k = np.array([1,2,3,True],dtype='U15')
a = np.array([1.0,2.02,3.03],dtype='U15')
print(s.dtype,n.dtype,o.dtype,k.dtype,a.dtype)  # <U15 <U15 <U15 <U15 <U15

还可以给ndarray每列数据,设置一个列名和dtype

import numpy as np
nd1 = np.array([[1, 'A'],[2, 'B']],dtype=[('name', 'U15')])
print(nd1,type(nd1),nd1.dtype)
# [[('1',) ('A',)] [('2',) ('B',)]] <class 'numpy.ndarray'> [('name', '<U15')]

每个列名可以设置不同的列名和不同的dtype

import numpy as np
nd3 = np.array([(1, 'A'),(2, 'B')], dtype=[('id', int), ('name', 'U10')])
print(nd3,type(nd3),nd3.dtype)
# [(1, 'A') (2, 'B')] <class 'numpy.ndarray'> [('id', '<i4'), ('name', '<U10')]

但是下面的这个例子就是出错的,注意对比看区别:

import numpy as np
nd4 = np.array([1, 'A'],[2, 'B'], dtype=[('id', int), ('name', 'U10')])
# TypeError: argument for array() given by name ('dtype') and position (position 1)
# print(nd4,type(nd4),nd4.dtype)
为什么会报错?请注意元素类型,一个是tuple,一个是list

分析 dtype 类型

每个dtype类型实际上都代表了三个意思,分别是:字节顺序、尺寸、数据类型。范例分析:

import numpy as np
dt = np.dtype('>i4')
print("字节顺序:",dt.byteorder)  # >
print("尺寸size:",dt.itemsize)   # 4
print("数据类型:",dt.name)       # int32

>表示大端字节顺序,而<表示小端字节编码。

苏南大叔:初步分析ndarray类型变量的dtype属性,U10表示什么意思? - dtype解析
初步分析ndarray类型变量的dtype属性,U10表示什么意思?(图2-2)

所以,回到标题上,U10表示什么意思呢?

import numpy as np
dt = np.dtype('U10')
print("字节顺序:",dt.byteorder)  # =
print("尺寸size:",dt.itemsize)   # 40
print("数据类型:",dt.name)       # str320

因为这里其实还是非常复杂的,苏南大叔暂时不准备继续展开讨论。如果碰到新的dtype,可以使用上面的方法分析一下先。

参考文章

结语

更多苏南大叔的python相关经验文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python