HERE 查看笔记效果更好噢
大型数组运算
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]
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])
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]])
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 ]
random.choice(values)
1
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)
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)
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))