**啰嗦话:**我的研究方向是多智能强化学习,偶然间在github上看见了Datawhale的关于李宏毅老师的笔记简直发现了宝藏(哈哈哈),接下来参加第一次组队学习,说实话对于写博客,我还是更喜欢把东西记在自己本子上,可能我是老古董了,废话不多下面是学习内容,(作为自己的笔记,防止以后忘了)
1、 python基础
说说实话python这块还是比较熟悉哈哈哈,但是还是学习一下吧。
1.1列表与赋值
老规矩直接上代码
L = []
def my_func(x):
return 2*x
for i in range(5):
L.append(my_func(i))
print(L)##[0, 2, 4, 6, 8]
这段代码就不多说了,很容易读懂,接下来讲些比较有用的,用[* for i in *]
的形式改写上面的代码,看起比较简洁一点,第一个 * 为映射函数,其输入为后面 i 指代的内容,第二个 * 表示迭代的对象。这样是不是看起来简洁多了。
L = []
def my_func(x):
return 2*x
# for i in range(5):
# L.append(my_func(i))
#print(L)##[0, 2, 4, 6, 8]
[L.append(my_func(i))for i in range(5)]
print(L)#[0, 2, 4, 6, 8]
1.2 匿名函数简化代码,下面是相关的例子
my_func = lambda x:2*x
print(my_func(3))#6
my_func = lambda a,b:a+b
print(my_func(5,6))#11
1.3 zip与enumerate
zip就是用来打包,不是有些压缩包的格式就是zip吗?上例子。
L1,L2,L3 = list('123'),list('abc'),list('789')
new_list =list(zip(L1,L2,L3))
print(new_list)##[('1', 'a', '7'), ('2', 'b', '8'), ('3', 'c', '9')]
解压缩:利用 * 操作符和 zip 联合使用来进行解压操作
L1,L2,L3 = list('123'),list('abc'),list('789')
new_list =list(zip(L1,L2,L3))
#print(new_list)
un_zip = list(zip(*new_list))
print(un_zip)##[('1', '2', '3'), ('a', 'b', 'c'), ('7', '8', '9')]
enumerate 枚举迭代,把列组当中的位置信息绑定
L1= list('abc')
for index,value in enumerate(L1):
print(index,value)
# 0 a
# 1 b
# 2 c
2、 Numpy基础
2.1构建数组
一般是通过arry来构建,废话不多说,上代码。
import numpy as np
a=np.array([2,3,4],dtype=np.int64)
print(a.dtype)##int64
print(a)
"""
[2 3 4]
"""
a=np.array([[2,3,4],
[2,5,6] ],dtype=np.int64)
print(a.dtype)#int64
print(a)
"""
[[2 3 4]
[2 5 6]]
"""
2.2 下边是一些特殊矩阵的的构造
2.3随机种子
随机种子的这个概念,本人经常用到,看到这也就顺手做个笔记写上吧
2.4数组的变形与合并
这里主要用到了线性代数的知识,转置对应的符号为.T
,合并对应的np.r_[ ]
和np.c_[ ]
分别表示上下合并和左右合并,其实在这里,我一直把上下合并和左右合并搞混淆(我这脑子。。。。)
2.5维度变化reshape
简单点说就是把数组变成你想要的形式,有两种模式之分,C 和 F, 分别代表以逐行和逐列的顺序进行填充读取。默认按行进行,上代码。
小tip:a.reshape(4,-1)
等价于a.reashape(4,2)
,这点和TensorFlow中reshape有些类似,当然Tf中维度的变换更加灵活。
import numpy as np
a = np.arange(8).reshape(2,4)
print(a)
"""
[[0 1 2 3]
[4 5 6 7]]
"""
new_a = a.reshape((4,2),order='c') ##行读取和填充
print(new_a)
"""
[[0 1]
[2 3]
[4 5]
[6 7]]
"""
new_a = a.reshape((4,2),order='F')#按列读取和填充
print(new_a)
"""
[[0 2]
[4 6]
[1 3]
[5 7]]
"""
2.6切片和索引
利用 np.ix_ 在对应的维度上使用布尔索引,这个没用过!Mark一下,此时不能使用slice切片。
2.7 常用函数
where
一种条件函数,当满足或不满足设定的条件可以在相应的位置上进行操作
nonzero
返回非零索引
argmax
返回最大数索引
argmin
返回最小数索引
any
当序列至少存在一个True或者非零元素时就返回True,否则返回False,用法a.any()
,a为序列
all
全为True或者全为非零元素时 ,返回True,用法a.all()
,a为序列
2.8广播机制
当一个标量和数组进行运算时,标量会自动把大小扩充为数组大小,之后进行逐元素操作上代码:
import numpy as np
a = np.ones((2,2))
res = 3*a +1
print(res)
"""
[[4. 4.]
[4. 4.]]
"""
二维数组之间的操作,是是对应元素进行相关的操作,(注意这里不是矩阵的计算),上代码:
res = np.ones((3,2))
print(res)
a=np.array([[2],
[3],
[4]])
#print(a)
"""
[[2]
[3]
[4]]
"""
new_res = res*a
print(new_res)
"""
[[2. 2.]
[3. 3.]
[4. 4.]]
"""
2.9 向量与矩阵的计算
向量的内积使用dot
。
a = np.array([1,2,3])
b= np.array([1,3,5])
print(a.dot(b))#22
矩阵的乘法,使用符号@
,注意线性代数中规定的相乘的条件 ,具体使用如下:
a = np.arange(4).reshape(2,2)
b = np.arange(-4,0).reshape(2,2)
res = a @ b
print(res)
"""
[[ -2 -1]
[-14 -9]]
"""
3、习题
3.1一般的矩阵乘法根据公式,可以由三重循环写出:请将其改写为列表推导式的形式。
解:直接上代码吧,说实话,我自己做的错了,忘了矩阵相乘变换位置最后结果也要变,哈哈哈哈直接上正确答案吧
M1 = np.random.rand(2,3)
M2 = np.random.rand(3,4)
res = [[sum([M1[i, k]*M2[k,j] for k in range(M1.shape[1])]) for j in range(M2.shape[1])] for i in range(M1.shape[0])]
print((((M1@M2-np.array(res)))<1e-15).all())##True
3.2
解:
A = np.arange(1,10).reshape(3,3)
print(A)
B1 = (1/A)
#print(B1)
B2 =B1.sum(axis=1)
#print(B2)
B3 = B2.reshape(3,1)
#print(B3)
B = A*B3
print(B)
"""
[[1.83333333 3.66666667 5.5 ]
[2.46666667 3.08333333 3.7 ]
[2.65277778 3.03174603 3.41071429]]
"""
3.3
解:直接照着公式打
A = np.random.randint(10, 20, (8, 5))
B = A.sum(0)*A.sum(1).reshape(-1, 1)/A.sum()
res = ((A-B)**2/B).sum()
print(res)
3.4解:不太会,参考的答案。
3.5
输入一个整数的 Numpy 数组,返回其中递增连续整数子数组的最大长度。例如,输入 [1,2,5,6,7],[5,6,7] 为
具有最大长度的递增连续整数子数组,因此输出 3;输入 [3,2,1,2,3,4,6],[1,2,3,4] 为具有最大长度的递增连
续整数子数组,因此输出 4。请充分利用 Numpy 的内置函数完成。(提示:考虑使用 nonzero, diff 函数)
解:
要是连续的话前后差是1。
我的
a = np.array([1,2,3,8,6])
b = np.r_[1,np.diff(a)!=1,1]
#print(b)
c = np.nonzero(b)
print(np.diff(c).max())###3
参考答案: