2020-10-20Numpy

2020-10-20  本文已影响0人  没头脑_ef80

数据类型及数组创建

通常将 numpy 库 缩写为 np

import numpy as np

1、常量

numpy.nan 表示空值

* np.nan != np.nan 两个numpy.nan是不相等的

numpy.inf 表示正无穷大

Inf = inf = infty = Infinity = PINF

numpy.pi 表示圆周率

numpy.e 表示自然常数


2、常见数据类型


3、时间日期和时间增量

numpy.datetime64

从字符串创建datetime64数组时,如果单位不统一,一律转化为最小单位

import numpy

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]

用arrange可以创建datetime64数组,用于生成日期范围。

import numpy as np

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']

print(a.dtype) # datetime64[D]

a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64)

print(a)

# ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...

# '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']

print(a.dtype) # datetime64[m]

a = np.arange('2020-05', '2020-12', dtype=np.datetime64)

print(a)

# ['2020-05' '2020-06' '2020-07' '2020-08' '2020-09' '2020-10' '2020-11']

print(a.dtype) # datetime64[M]

timedelta64表示两个datetime64的差,于两个相减运算中的datetime64中较小的一个保持一致。

numpy.datetime64 与 datetime.datetime 可以相互转换

import numpy as np

import datetime

dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30)

dt64 = np.datetime64(dt, 's')

print(dt64, dt64.dtype)

# 2020-06-01T20:05:30 datetime64[s]

dt2 = dt64.astype(datetime.datetime)

print(dt2, type(dt2))

# 2020-06-01 20:05:30 <class 'datetime.datetime'>

numpy.busday_offset 

参数:offset 偏移量 forward backward 向前后取有效工作日

将指定的偏移量应用于工作日,单位天('D')。计算下一个工作日,如果当前日期为非工作日,默认报错。可以指定 forward 或

backward 规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)

import numpy as np

# 2020-07-10 星期五

a = np.busday_offset('2020-07-10', offsets=1)

print(a) # 2020-07-13

a = np.busday_offset('2020-07-11', offsets=1)

print(a)

# ValueError: Non-business day date in busday_offset

a = np.busday_offset('2020-07-11', offsets=0, roll='forward')

b = np.busday_offset('2020-07-11', offsets=0, roll='backward')

print(a) # 2020-07-13

print(b) # 2020-07-10

a = np.busday_offset('2020-07-11', offsets=1, roll='forward')

b = np.busday_offset('2020-07-11', offsets=1, roll='backward')

print(a) # 2020-07-14

print(b) # 2020-07-13

import numpy as np

# 2020-07-10 星期五

a = np.is_busday('2020-07-10')

b = np.is_busday('2020-07-11')

print(a) # True

print(b) # False

# 统计一个时间周期内的工作天数 

import numpy as np 

# 2020-07-10 星期五

begindates = np.datetime64('2020-07-10')

enddates = np.datetime64('2020-07-20')

a = np.arange(begindates, enddates, dtype='datetime64')

b = np.count_nonzero(np.is_busday(a))

print(a)

# ['2020-07-10' '2020-07-11' '2020-07-12' '2020-07-13' '2020-07-14'

# '2020-07-15' '2020-07-16' '2020-07-17' '2020-07-18' '2020-07-19']

print(b) # 6

# 自定义周掩码值,即指定一周中哪些星期是工作日。

import numpy as np

# 2020-07-10 星期五

a = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 1, 0, 0])

b = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 0, 0, 1])

print(a) # True

print(b) # False

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

numy.fromfuction() 构建数组

import numpy as np

def f(x, y):

return 10 * x + y

x = np.fromfunction(f, (5, 4), dtype=int)

print(x)

# [[ 0 1 2 3]

# [10 11 12 13]

# [20 21 22 23]

# [30 31 32 33]

# [40 41 42 43]]

x = np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)

print(x)

# [[ True False False]

# [False True False]

# [False False True]]

numpy.zeros()

numpy.zeros_like()

numpy.ones()

numpy.ones_like()

numpy.empty()

numpy.empty_like()

numpy.full()

numpy.full_like()

import numpy as np

x = np.zeros(5)

print(x) # [0. 0. 0. 0. 0.]

x = np.zeros([2, 3])

print(x)

# [[0. 0. 0.]

# [0. 0. 0.]]

x = np.array([[1, 2, 3], [4, 5, 6]])

y = np.zeros_like(x)

print(y)

# [[0 0 0]

# [0 0 0]]

x = np.ones(5)

print(x) # [1. 1. 1. 1. 1.]

x = np.ones([2, 3])

print(x)

# [[1. 1. 1.]

# [1. 1. 1.]]

x = np.array([[1, 2, 3], [4, 5, 6]])

y = np.ones_like(x)

print(y)

# [[1 1 1]

# [1 1 1]]

numpy.eye() 返回对角线上为1,其他地方为零的单位数组

identity() 返回一个方的单位数组

numpy.diag() 提取对角线

import numpy as np

x = np.arange(9).reshape((3, 3))

print(x)

# [[0 1 2]

# [3 4 5]

# [6 7 8]]

print(np.diag(x)) # [0 4 8]

print(np.diag(x, k=1)) # [1 5]

print(np.diag(x, k=-1)) # [3 7]

v = [1, 3, 5, 7]

x = np.diag(v)

print(x)

# [[1 0 0 0]

# [0 3 0 0]

# [0 0 5 0]

# [0 0 0 7]]

利用数值范围来创建ndarray

1. arange() 函数:返回给定间隔内的均匀间隔的值。

2. linspace() 函数:返回指定间隔内的等间隔数字。

3. logspace() 函数:返回数以对数刻度均匀分布。

4. numpy.random.rand() 返回一个由[0,1)内的随机数组成的数组。

import numpy as np

x = np.arange(5)

print(x) # [0 1 2 3 4]

x = np.arange(3, 7, 2)

print(x) # [3 5]

x = np.linspace(start=0, stop=2, num=9)

print(x)

# [0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]

x = np.logspace(0, 1, 5)

print(np.around(x, 2))

# [ 1. 1.78 3.16 5.62 10. ]

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'>

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)]

上一篇 下一篇

猜你喜欢

热点阅读