Numpy实践学习笔记-task1


感谢阿里云天池龙珠训练营提供的学习计划,学习地址为:https://tianchi.aliyun.com/course/323

常量

numpy.nan

nan = NaN = NAN都表示空值
nan是不相等的
在这里插入图片描述

numpy.isnan用法:

numpy.isnan(x, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj]) = <ufunc ‘isnan’>

  • 参数:
    x: : array_like
    输入数组。
    out: : ndarray, None, 或 tuple of ndarray and None, 可选参数。结果存储的位置。如果提供,它必须具有输入广播到的形状。如果未提供或没有,则返回一个新分配的数组。元组(只能作为关键字参数)的长度必须等于输出的数量。
    where: : array_like, 可选参数
    此条件通过输入广播。在条件为True的位置,将out数组设置为ufunc结果。在其他地方,out数组将保留其原始值。请注意,如果通过默认创建未初始化的输出数组out=None,条件中为False的位置将保持未初始化状态。
  • 返回值:
    y: : ndarray或布尔
    真实的地方x是NaN,否则为false。如果x是标量,则这是标量。
  • 注意:
    NumPy使用IEEE算术二进制浮点标准(IEEE 754)。这意味着非数字不等于无穷大。
    【例如】
    在这里插入图片描述

numpy.inf

  • 表示正无穷大。
    Inf = inf = infty = Infinity = PINF

在这里插入图片描述

numpy.pi

  • 表示圆周率
    在这里插入图片描述

numpy.e

  • 表示自然常数
    在这里插入图片描述

数据类型

常见的数据类型:

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(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_,np.float32等

每个内建类型都有一个唯一定义它的字符代码,如下:

字符对应类型备注
bboolean‘b1’
isigned integer‘i1’, ‘i2’, ‘i4’, ‘i8’
uunsigned integer‘u1’, ‘u2’ ,‘u4’ ,‘u8’
ffloating-point‘f2’, ‘f4’, ‘f8’
ccomplex floating-point复数浮点
mtimedelta64表示两个时间之间的间隔
Mdatetime64日期时间类型
OobjectPython 对象
S(byte-)stringS3表示长度为3的字符串
UUnicodeUnicode 字符串
Vvoid原始数据(void)

dtype可由以下语法构造

numpy.dtype(object, align, copy)

数据类型信息

Python 的浮点数通常是64位浮点数,几乎等同于 np.float64。

NumPy和Python整数类型的行为在整数溢出方面存在显着差异,与 NumPy 不同,Python 的int 是灵活的。这意味着Python整数可以扩展以容纳任何整数并且不会溢出。

时间日期和时间增量

  • datetime64
    在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64(datetime 已被 python 包含的日期时间库所占用)。

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

日期单位代码含义时间单位代码含义
Yh小时
Mm分钟
Ws
Dms毫秒
--us微秒
--ns纳秒
--ps皮秒
--fs飞秒
--as阿托秒

相邻单位之间互为1000的倍数

单个时间格式字符串转换为numpy的datetime对象,可使用datetime64实例化一个对象

从字符串创建 datetime64 类型时,默认情况下,numpy 会根据字符串自动选择对应的单位
在这里插入图片描述
同时也可以自己指定类型。

反过来numpy的datetime对象转换为时间格式字符串,可使用datetime_as_string()函数,如下所示:
在这里插入图片描述

  • 从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位。
    在这里插入图片描述
  • 使用arange()创建 datetime64 数组,用于生成日期范围
    在这里插入图片描述

datetime,Timestamp和datetime64之间转换

from IPython.display import Image
from IPython.core.display import HTML
Image(url= "https://i.stack.imgur.com/uiXQd.png")

在这里插入图片描述

datetime64 和 timedelta64 运算

timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致
在这里插入图片描述
日期对调位置之后结果并不相同,有正负之分。
在这里插入图片描述

生成 timedelta64时,要注意年(‘Y’)和月(‘M’)这两个单位无法和其它单位进行运算

import numpy as np

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'

datetime64 的应用

为了允许在只有一周中某些日子有效的上下文中使用日期时间,NumPy包含一组“busday”(工作日)功能。
busday函数的默认值是,唯一有效的天数是周一到周五(通常的工作日)。该实现基于包含7个布尔标志以指示有效天的“周掩模”;可以指定其他组的有效天数的自定义周边掩码。
“busday”功能还可以检查“假日”日期的列表,不是有效日期的特定日期。

numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)

参数roll:{‘raise’, ‘nat’, ‘forward’, ‘following’, ‘backward’, ‘preceding’, ‘modifiedfollowing’, ‘modifiedpreceding’}

  • ‘raise’ means to raise an exception for an invalid day.
  • ‘nat’ means to return a NaT (not-a-time) for an invalid day.
  • ‘forward’ and ‘following’ mean to take the first valid day later in time.
  • ‘backward’ and ‘preceding’ mean to take the first valid day earlier in time.

将指定的偏移量应用于工作日,单位天(‘D’)。计算下一个工作日,如果当前日期为非工作日,默认报错。可以指定 forward 或 backward 规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)

import numpy as np

# 2021-05-18 星期二
a = np.busday_offset('2021-05-18', offsets=1)
print(a)  # 2021-05-19

a = np.busday_offset('2021-05-16', offsets=1)
print(a)
# ValueError: Non-business day date in busday_offset

a = np.busday_offset('2021-05-16', offsets=0, roll='forward')
b = np.busday_offset('2021-05-16', offsets=0, roll='backward')
print(a)  # 2021-05-17
print(b)  # 2021-05-14

a = np.busday_offset('2020-05-16', offsets=1, roll='forward')
b = np.busday_offset('2020-05-16', offsets=1, roll='backward')
print(a)  # 2021-05-18
print(b)  # 2021-05-17

可以指定偏移量为 0 来获取当前日期向前或向后最近的工作日,当然,如果当前日期本身就是工作日,则直接返回当前日期。
【例如】返回指定日期是否是工作日

import numpy as np

# 2021-05-18 星期二 
# 2021-05-16 星期日
a = np.is_busday('2021-05-18')
b = np.is_busday('2021-05-16')
print(a)  # True
print(b)  # False

【例如】统计一个 datetime64[D] 数组中的工作日天数

import numpy as np
# 2021-05-18 星期二
```python
begindates = np.datetime64('2021-05-18')
enddates = np.datetime64('2021-05-28')
a = np.arange(begindates, enddates, dtype='datetime64')
b = np.count_nonzero(np.is_busday(a))
print(a)
# ['2021-05-18' '2021-05-19' '2021-05-20' '2021-05-21' '2021-05-22'
#  '2021-05-23' '2021-05-24' '2021-05-25' '2021-05-26' '2021-05-27']
print(b)  # 8

在这里插入图片描述

数组的创建

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

1. 依据现有数据来创建 ndarray

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

创建一维数组
在这里插入图片描述
创建二维数组

创建三维数组

(b)通过asarray()函数进行创建

array()和asarray()都可以将结构数据转化为 ndarray,但是array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

array()和asarray()的区别。(array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。

(c)通过fromfunction()函数进行创建

给函数绘图的时候可能会用到fromfunction(),该函数可从函数中创建数组

def fromfunction(function, shape, **kwargs):

以下使用fromfunction函数,创建一个数组a,a返回的结果是经过我们自定义的函数的结果,所以a中存储的是y的值,而i其实就是数组的索引;也就是说,数组a存储的是i取值从0到1时,y的值。fromfunction的第二个参数定义了输出数组的形状,也表示i的取值范围。
在这里插入图片描述
如果要创建的是二维数组,则函数式需要两个自变量,比如y=i*j:

2. 依据 ones 和 zeros 填充方式

在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。

(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):

3. 利用数值范围来创建ndarray

  • arange()函数:返回给定间隔内的均匀间隔的值。
  • linspace()函数:返回指定间隔内的等间隔数字。
  • logspace()函数:返回数以对数刻度均匀分布。
  • numpy.random.rand() 返回一个由[0,1)内的随机数组成的数组。
def arange([start,] stop[, step,], dtype=None): 
def linspace(start, stop, num=50, endpoint=True, retstep=False, 
             dtype=None, axis=0):
def logspace(start, stop, num=50, endpoint=True, base=10.0, 
             dtype=None, axis=0):
def rand(d0, d1, ..., dn): 

4. 结构数组的创建

结构数组,首先需要定义结构,然后利用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), ('XiaoHong', 15, 67.), ('Cat', 34, 45.8)],
             dtype=personType)
print(a, type(a))

(b)利用包含多个元组的列表来定义结构


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值