Numpy入门之数据类型及数组创建

it2023-10-28  81

数据类型及数组创建

常量

空值

print(np.nan) # nan print(np.NAN) # nan print(np.NaN) # nan

numpy中 nan = NaN = NAN 表达的含义一样,字面意思为Not a Number。

np.nan is np.NaN is np.NAN #地址相同 #TRUE None == None #True np.nan == np.nan #nan不同于None不能用 == 进行比较,可以理解为数学上无法表示的无理数 #False print(type(np.nan)) #<class 'float'> print(type(np.NAN)) #<class 'float'> print(type(np.NaN)) #<class 'float'> print(type(None)) #<class 'NoneType'>

由上面的给出的结果可以知道numpy中 nan 与 None 数据类型是有明显的差别的,但它们的逻辑意义几乎一致。

nan空值inf无穷大pi圆周率e自然常数

数据类型

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 字符串Vvoid

数据类型信息

numpy 和 pyhton 整数类型的行为在整数溢出方面存在显著差异,python int 是灵活的。意味着不会溢出。


时间日期和时间增量

datetime64 基础

datatime64 是带单位的日期时间类型,其单位如下:

日期单位代码含义时间单位代码含义Y年h小时M月m分钟W周s秒D天ms毫秒--us微秒--ns纳秒--ps皮秒--fs飞秒--as阿托秒

【例】

a = np.datetime64('2020-03-01') print(a, a.dtype) # 2020-03-01 datetime64[D] a = np.datetime64('2020-03-08 20:00:05') print(a, a.dtype) # 2020-03-08T20:00:05 datetime64[s] a = np.datetime64('2020-03', 'D') print(a, a.dtype) # 2020-03-01 datetime64[D] a = np.datetime64('2020-03', 'Y') print(a, a.dtype) # 2020 datetime64[Y] print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False

根据输出单位不同 numpy 会自动匹配相应的日期,若输入的日期中没有包含当前单位所匹配的值则自动输入该单位日期的初始值,故 2019-03 和 2019-03-01 所表示的其实是同一个时间,所以如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天数)是安全的。


【例】

a = np.array(['2020-03', '2020-03-08', '2020-03-08 20:00'], dtype='datetime64') print(a, a.dtype) # ['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]

从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位

使用arange()创建 datetime64 数组,用于生成日期范围。

a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64) print(a) ''''[2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05''2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09']'''

datetime64 和 timedelta64 运算

imedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。

【例】

a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07') b = np.datetime64('2020-03-08') - np.datetime64('202-03-07 08:00') c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00', 'D') print(a, a.dtype) # 1 days timedelta64[D] print(b, b.dtype) # 956178240 minutes timedelta64[m] print(c, c.dtype) # 1 days timedelta64[D] a = np.datetime64('2020-03') + np.timedelta64(20, 'D') b = np.datetime64('2020-06-15 00:00') + np.timedelta64(12, 'h') print(a, a.dtype) # 2020-03-21 datetime64[D] print(b, b.dtype) # 2020-06-15T12:00 datetime64[m]

【例】生成 timedelta64时,要注意年(‘Y’)和月(‘M’)这两个单位之间可以进行运算但无法和其它单位进行运算(一年有几天?一个月有几个小时?这些都是不确定的)。

a = np.timedelta64(1, 'Y') b = np.timedelta64(a, 'M') print(a) # 1 years print(b) # 12 months c = np.timedelta64(1, 'h') d = np.timedelta64(c, 'm') print(c) # 1 hours print(d) # 60 minutes print(np.timedelta64(a, 'D')) # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind' print(np.timedelta64(b, 'D')) # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'

【例】timedelta64 的运算

a = np.timedelta64(1, 'Y') b = np.timedelta64(6, 'M') c = np.timedelta64(1, 'W') d = np.timedelta64(1, 'D') e = np.timedelta64(10, 'D') print(a) # 1 years print(b) # 6 months print(a + b) # 18 months print(a - b) # 6 months print(2 * a) # 2 years print(a / b) # 2.0 print(c / d) # 7.0 print(c % e) # 7 days

数组的创建

numpy 提供的最重要的数据结构是 ndarray,它是 python list 的扩展

依据现有数据来创建 ndarray

通过array()函数进行创建。

通过asarray()函数进行创建

通过fromfunction()函数进行创建

依据 ones 和 zeros 填充方式

空数组empty()函数

单位数组eye()函数、identity()函数

对角数组diag()函数

常数数组full()函数、full_like()函数

利用数值范围来创建ndarray

arange()函数linspace()函数logspace()函数numpy.random.rand()

结构数组的创建

结构数组,首先需要定义结构,然后利用np.array()来创建数组,其参数dtype为定义的结构。

数组的属性

在使用 numpy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了很多便捷的方法,可以给你想要的信息。

numpy.ndarray.ndim用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1,二维数组的秩为 2,以此类推。numpy.ndarray.shape表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。numpy.ndarray.size数组中所有元素的总量,相当于数组的shape中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。numpy.ndarray.dtype ndarray 对象的元素类型。numpy.ndarray.itemsize以字节的形式返回数组中每一个元素的大小。
最新回复(0)