Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而,对于科学计算,通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。
下表列举了常用 numpy 基本类型。
类型备注说明bool_ = bool88位布尔类型int8 = byte8位整型int16 = short16位整型int32 = intc32位整型int_ = int64 = long = int0 = intp64位整型uint8 = ubyte8位无符号整型uint16 = ushort16位无符号整型uint32 = uintc32位无符号整型uint64 = uintp = uint0 = uint64位无符号整型float16 = half16位浮点型float32 = single32位浮点型float_ = float64 = double64位浮点型str_ = unicode_ = str0 = unicodeUnicode 字符串datetime64日期时间类型timedelta64表示两个时间之间的间隔numpy 的数值类型实际上是 dtype 对象的实例。
class dtype(object): def __init__(self, obj, align=False, copy=False): pass每个内建类型都有一个唯一定义它的字符代码,如下:
字符对应类型备注bboolean‘b1’isigned integer‘i1’, ‘i2’, ‘i4’, ‘i8’uunsigned integer‘u1’, ‘u2’ ,‘u4’ ,‘u8’ffloating-point‘f2’, ‘f4’, ‘f8’ccomplex floating-pointmtimedelta64表示两个时间之间的间隔Mdatetime64日期时间类型OobjectS(byte-)stringS3表示长度为3的字符串UUnicodeUnicode 字符串VvoidPython 的浮点数通常是64位浮点数,几乎等同于 np.float64。 NumPy和Python整数类型的行为在整数溢出方面存在显着差异,与 NumPy 不同,Python 的int 是灵活的。这意味着Python整数可以扩展以容纳任何整数并且不会溢出。
在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64(datetime 已被 python 包含的日期时间库所占用)。
datatime64是带单位的日期时间类型,其单位如下:
日期单位代码含义时间单位代码含义Y年h小时M月m分钟W周s秒D天ms毫秒--us微秒--ns纳秒--ps皮秒--fs飞秒--as阿托秒(a) 通过array()函数进行创建
def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0):(b)通过asarray()函数进行创建
def asarray(a, dtype=None, order=None): return array(a, dtype, copy=False, order=order)(c)通过fromfunction()函数进行创建
def fromfunction(function, shape, **kwargs):注意:array()和asarray()都可以将结构数据转化为 ndarray,但是array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。
(a)零数组
zeros()函数:返回给定形状和类型的零数组。
zeros_like()函数:返回与给定数组形状和类型相同的零数组。
def zeros(shape, dtype=None, order='C'):
def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
(b)1数组
ones()函数:返回给定形状和类型的1数组。
ones_like()函数:返回与给定数组形状和类型相同的1数组。
def ones(shape, dtype=None, order='C'):
def ones_like(a, dtype=None, order='K', subok=True, shape=None):
(c)空数组
empty()函数:返回一个空数组,数组元素为随机数。empty_like函数:返回与给定数组具有相同形状和类型的新数组。def empty(shape, dtype=None, order='C'):def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):(d)单位数组
eye()函数:返回一个对角线上为1,其它地方为零的单位数组。identity()函数:返回一个方的单位数组。def eye(N, M=None, k=0, dtype=float, order='C'):def identity(n, dtype=None):(e)对角数组
diag()函数:提取对角线或构造对角数组。def diag(v, k=0):(f)常数数组
full()函数:返回一个常数数组。full_like()函数:返回与给定数组具有相同形状和类型的常数数组。def full(shape, fill_value, dtype=None, order='C'):def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):结构数组,首先需要定义结构,然后利用np.array()来创建数组,其参数dtype为定义的结构。
(a)利用字典来定义结构 【例】
import numpy as np personType = np.dtype({ 'names': ['name', 'age', 'weight'], 'formats': ['U30', 'i8', 'f8']}) a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)], dtype=personType) print(a, type(a)) # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)] # <class 'numpy.ndarray'>(b)利用包含多个元组的列表来定义结构 【例】
import numpy as np personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')]) a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)], dtype=personType) print(a, type(a)) # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)] # <class 'numpy.ndarray'> # 结构数组的取值方式和一般数组差不多,可以通过下标取得元素: print(a[0]) # ('Liming', 24, 63.9) print(a[-2:]) # [('Mike', 15, 67. ) ('Jan', 34, 45.8)] # 我们可以使用字段名作为下标获取对应的值 print(a['name']) # ['Liming' 'Mike' 'Jan'] print(a['age']) # [24 15 34] print(a['weight']) # [63.9 67. 45.8]在使用 numpy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了很多便捷的方法,可以给你想要的信息。
numpy.ndarray.ndim用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1,二维数组的秩为 2,以此类推。numpy.ndarray.shape表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。numpy.ndarray.size数组中所有元素的总量,相当于数组的shape中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。numpy.ndarray.dtype ndarray 对象的元素类型。numpy.ndarray.itemsize以字节的形式返回数组中每一个元素的大小。 class ndarray(object): shape = property(lambda self: object(), lambda self, v: None, lambda self: None) dtype = property(lambda self: object(), lambda self, v: None, lambda self: None) size = property(lambda self: object(), lambda self, v: None, lambda self: None) ndim = property(lambda self: object(), lambda self, v: None, lambda self: None) itemsize = property(lambda self: object(), lambda self, v: None, lambda self: None)