初步分析ndarray类型变量的dtype属性,U10表示什么意思?
发布于 作者:苏南大叔 来源:程序如此灵动~
在通过numpy的ndarray类型变量,分析各种科学数据的时候,经常会看到U10,<U5,i5,>i4之类的奇怪表述。它们实际上是ndarray的dtype,也就是数组的子元素类型。在本文中,苏南大叔会对dtype做简要的初步分析。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:win10,python@3.12.0,numpy@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>表示大端字节顺序,而<表示小端字节编码。

所以,回到标题上,U10表示什么意思呢?
import numpy as np
dt = np.dtype('U10')
print("字节顺序:",dt.byteorder) # =
print("尺寸size:",dt.itemsize) # 40
print("数据类型:",dt.name) # str320因为这里其实还是非常复杂的,苏南大叔暂时不准备继续展开讨论。如果碰到新的dtype,可以使用上面的方法分析一下先。
参考文章
结语
更多苏南大叔的python相关经验文章,请点击下面的链接: