初步分析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
相关经验文章,请点击下面的链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。