Python Cookbook学习笔记ch3_02

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FANGLICHAOLIUJIE/article/details/82261543

HERE查看笔记效果更好噢

大型数组运算

  • 问题:需要在大型数据集上计算
  • 方案:采用numpy
x = [1,2,3,4]
y = [5,6,7,8]
x*2
[1, 2, 3, 4, 1, 2, 3, 4]
x+10
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-2-e0cbb565319e> in <module>()
----> 1 x+10


TypeError: can only concatenate list (not "int") to list
x+[10]
[1, 2, 3, 4, 10]
x+y
[1, 2, 3, 4, 5, 6, 7, 8]
  • 现在引入numpy运算
import numpy as np
ax = np.array([1,2,3,4])
ay = np.array([5,6,7,8])
ax*2
array([2, 4, 6, 8])
ax+ay
array([ 6,  8, 10, 12])
ax*ay
array([ 5, 12, 21, 32])
  • 可以定义一个函数,将一个numpy数组传入,则这个函数会作用到每个元素
def f(x):
    return 2*x**2 - 3*x
f(ax)
array([-1,  2,  9, 20])
  • 此外numpy 还提供了很多通用函数
np.sqrt(ax)
array([1.        , 1.41421356, 1.73205081, 2.        ])
np.cos(ay)
array([ 0.28366219,  0.96017029,  0.75390225, -0.14550003])
grid =np.zeros(shape=(4,4),dtype='float')
grid
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
grid+4
array([[4., 4., 4., 4.],
       [4., 4., 4., 4.],
       [4., 4., 4., 4.],
       [4., 4., 4., 4.]])
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
a[1]
array([5, 6, 7, 8])
a[0][1]
2
a[0,1]
2
a[:][1]
array([5, 6, 7, 8])
a[:,1]
array([ 2,  6, 10])
a[1:3,1:3] +=10
a
array([[ 1,  2,  3,  4],
       [ 5, 16, 17,  8],
       [ 9, 20, 21, 12]])
a + [100,100,100,100]
array([[101, 102, 103, 104],
       [105, 116, 117, 108],
       [109, 120, 121, 112]])
a
array([[ 1,  2,  3,  4],
       [ 5, 16, 17,  8],
       [ 9, 20, 21, 12]])
np.where(a<10,a,10)
array([[ 1,  2,  3,  4],
       [ 5, 10, 10,  8],
       [ 9, 10, 10, 10]])

3.10 矩阵与线性代数运算

  • 问题:如何执行矩阵和线性代数的运算,如矩阵的乘法
  • 方案:使用numpy 的矩阵对象
import numpy as np
m = np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
m
matrix([[ 1, -2,  3],
        [ 0,  4,  5],
        [ 7,  8, -9]])
  • 矩阵的转置
m.T
matrix([[ 1,  0,  7],
        [-2,  4,  8],
        [ 3,  5, -9]])
  • 逆矩阵
m.I
matrix([[ 0.33043478, -0.02608696,  0.09565217],
        [-0.15217391,  0.13043478,  0.02173913],
        [ 0.12173913,  0.09565217, -0.0173913 ]])
v = np.matrix([[2],[3],[4]])
v
matrix([[2],
        [3],
        [4]])
m*v
matrix([[ 8],
        [32],
        [ 2]])
  • numpy.linalg中含有更多的操作函数
import numpy.linalg
numpy.linalg.det(m)
-229.99999999999983
  • 特征值
numpy.linalg.eigvals(m)
array([-13.11474312,   2.75956154,   6.35518158])
  • 求解线性方程
x = numpy.linalg.solve(m,v)
x
matrix([[0.96521739],
        [0.17391304],
        [0.46086957]])
m*x
matrix([[2.],
        [3.],
        [4.]])

随机选择

  • 问题:如何从一个序列中随机的抽取若干元素,或者生成几个随机数
  • 方案:使用random模块
import random
values = [1,2,3,4,5,6,7]
#choice()随机抽取一个元素
random.choice(values)
1
  • 随机抽取n个元素
random.sample(values,3)
[6, 5, 3]
random.sample(values,5)
[2, 6, 1, 4, 3]
  • 如果只是想打乱列表的顺序,可以使用shuffle()
random.shuffle(values)
values
[2, 5, 1, 7, 4, 6, 3]
  • 生成随机的整数:randint(n,m),生成n-m之间的整数
random.randint(0,10)
7
random.randint(0,4)
0
  • 生成0-1之间均匀分布的浮点数,使用random.random()
random.random()
0.40132838245175395
  • 获取N位随即位的整数,使用random.getrandbits()
random.getrandbits(200)
110472076103379638972941683526991004704667055961111836910142
  • 可以通过random.seed()来修改初始化种子
  • 此外还有 random.uniform()计算均匀分布随机数
  • random.gauss()计算正态分布随机数
random.seed()
random.seed(1234)
random.seed(b'bytedata')

3.12基本时间日期转换

  • 执行简单的时间转换,如天到秒等
  • 使用datetime模块
from datetime import timedelta
a = timedelta(days=2,hours=6)
b = timedelta(hours=4.5)
c = a+b
c.days
2
c.seconds
37800
c.seconds/3600
10.5
c.total_seconds()/3600
58.5
  • 如果想要指定日期和时间,可以使用datetime实例化一个对象
from datetime import datetime
a = datetime(2017,9,23)
print(a+ timedelta(days=10))
2017-10-03 00:00:00
b = datetime(2017,12,21)
d = b - a
d
datetime.timedelta(89)
print(datetime.today())
2018-08-31 19:04:57.042820
  • 处理更加复杂度的时间,可以使用dateutil模块
a = datetime(2012,9,23)
a + timedelta(months=10)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-73-5264ec8324d2> in <module>()
      1 a = datetime(2012,9,23)
----> 2 a + timedelta(months=10)


TypeError: 'months' is an invalid keyword argument for this function
from dateutil.relativedelta import relativedelta
a + relativedelta(months=1)
datetime.datetime(2012, 10, 23, 0, 0)
b = datetime(2012,12,21)
d = b-a
d
datetime.timedelta(89)
d = relativedelta(b,a)
d
relativedelta(months=+2, days=+28)
d.months
2

3.13计算最后一个周五的日期

  • 问题:需要查找星期中某一天最后出现的日期
  • 方案:使用datetime
  • 原理:算法原理是这样的:先将开始日期和目标日期映射到星期数组的位置上 (星期一索引为 0),然后通过模运算计算出目标日期要经过多少天才能到达开始日期。然后用开始日期减去那个时间差即得到结果日期。
from datetime import datetime,timedelta
weekdays = ['Monday','Tuesday','Wednsday','Thuesday','Friday','Saturday','Sunday']

def get_previous_byday(dayname,start_date=None):
    if start_date is None:
        start_date = datetime.today()
    day_num = start_date.weekday()
    day_num_target = weekdays.index(dayname)
    days_ago = (7+day_num - day_num_target)%7
    if days_ago ==0:
        days_ago = 7
    target_date = start_date - timedelta(days=days_ago)
    return target_date
datetime.today()
datetime.datetime(2018, 8, 31, 19, 27, 3, 337422)
get_previous_byday('Monday')
datetime.datetime(2018, 8, 27, 19, 27, 41, 704459)
get_previous_byday('Thuesday')
datetime.datetime(2018, 8, 30, 19, 28, 17, 76127)
  • 上述功能可以使用detautil模块的relativedelta()实现
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *
a = datetime.today()
a
datetime.datetime(2018, 8, 31, 19, 37, 45, 636591)
print(a + relativedelta(weekday=FR))
2018-08-31 19:37:45.636591
# 上个周一
print(a + relativedelta(weekday=MO(-1)))
2018-08-27 19:37:45.636591
#下个周一
print(a + relativedelta(weekday=MO))
2018-09-03 19:37:45.636591

3.14 计算当前月份的日期范围

  • 问题:代码需要在当前月份循环每一天,想找到一个计算这个日期范围的高效方法
  • 方案:在这样的日期上循环并需要事先构造一个包含所有日期的列表。你可以先计算出开始日期和结束日期,然后在你步进的时候使用 datetime.timedelta 对象递增这个日期变量即可
from datetime import datetime, date, timedelta
import calendar
def get_month_range(start_date=None):
    if start_date is None:
        start_date = date.today().replace(day=1)
    _,days_in_month = calendar.monthrange(start_date.year,start_date.month)
    end_date = start_date+ timedelta(days=days_in_month)
    return (start_date,end_date)
#正常days参数应该设置为1,这里为了减少输出,设置为4
a_day = timedelta(days=4)
first_day,last_day = get_month_range()
while first_day<last_day:
    print(first_day)
    first_day +=a_day
2018-08-01
2018-08-05
2018-08-09
2018-08-13
2018-08-17
2018-08-21
2018-08-25
2018-08-29

3.15字符串转换为日期

  • 问题:将字符串转换为datetime对象
  • 方案:使用datetime模块
from datetime import datetime
text = '2018-09-20'
y = datetime.strptime(text,'%Y-%m-%d')
y
datetime.datetime(2018, 9, 20, 0, 0)
z = datetime.now()
diff = z-y
diff
datetime.timedelta(-20, 71856, 515025)
  • strptime()很慢,可以考虑下面的做法
from datetime import datetime
def parse_ymd(s):
    year_s,month_s,day_s = s.split('-')
    return datetime(int(year_s),int(month_s),int(day_s))

猜你喜欢

转载自blog.csdn.net/FANGLICHAOLIUJIE/article/details/82261543
今日推荐