一,对有关命令行参数的一些总结:
https://blog.csdn.net/itlance_ouyang/article/details/52489674
Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。
https://blog.csdn.net/itlance_ouyang/article/details/52489674 (Python命令行命令getopt,argparse) https://blog.csdn.net/a1964543590/article/details/69791760 (这篇有关argparse讲得比较细)https://blog.csdn.net/ei1990/article/details/76423277 (flags的对比,argparse,tf两种) https://www.jianshu.com/p/a8f0b9c9dc58 (这篇很总结,并讲解了tf.app.run的原理)
总结起来的话,tf.app.flags.DEFINE_xxx()就是添加命令行的optional argument(可选参数),而tf.app.flags.FLAGS可以从对应的命令行参数取出参数。
二,有关numpy的一些知识
1,numpy基础——ndarray对象属性(https://blog.csdn.net/scorpion_zs/article/details/52526310) 这篇讲的比较细,可以配合下面那篇一起看
里面认为比较重要的知识点:
1.‘C’:行优先;’F’:列优先
>>> np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6,7]), offset=0, order="C")
array([[1, 2, 3],
[4, 5, 6]])
>>> np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6,7]), offset=0, order="F")
array([[1, 3, 5],
[2, 4, 6]])
- 函数ones创建一个全1的数组、函数zeros创建一个全0的数组、函数empty创建一个内容随机的数组,在默认情况下,用这些函数创建的数组的类型都是float64,若需要指定数据类型,只需要设置dtype参数即可。
- 从已知的数组中,创建shape相同的多维数组:ones_like、zeros_like、empty_like,用法如下:
>>> a = [[1,2,3], [3,4,5]]
>>> b = np.zeros_like(a)
>>> b
array([[0, 0, 0],
[0, 0, 0]])
#其他两个函数用法类似
- 还有一些特殊的函数,比如生成单位矩阵,对角线全是1,其余全是0之类的,具体见网站。
- arange函数类似python中的range函数,通过指定初始值、终值以及步长(默认步长为1)来创建数组;linspace函数通过指定初始值、终值以及元素个数来创建一维数组; logspace函数与linspace类似,只不过它创建的是一个等比数列.
>>> np.arange(0,10,2)
array([0, 2, 4, 6, 8])
>>> np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.linspace(0,10, 20)
array([ 0. , 0.52631579, 1.05263158, 1.57894737,
2.10526316, 2.63157895, 3.15789474, 3.68421053,
4.21052632, 4.73684211, 5.26315789, 5.78947368,
6.31578947, 6.84210526, 7.36842105, 7.89473684,
8.42105263, 8.94736842, 9.47368421, 10. ])
>>> np.logspace(0, 10, 10)
array([ 1.00000000e+00, 1.29154967e+01, 1.66810054e+02,
2.15443469e+03, 2.78255940e+04, 3.59381366e+05,
4.64158883e+06, 5.99484250e+07, 7.74263683e+08,
1.00000000e+10])
- fromstring函数从字符串中读取数据并创建数组, fromfunction函数由第一个参数作为计算每个数组元素的函数(函数对象或者lambda表达式均可),第二个参数为数组的形状。fromfunction的例子见网站
>>> s1 = "1,2,3,4,5"
>>> np.fromstring(s1, dtype=np.int64, sep=",")
array([1, 2, 3, 4, 5])
>>> s2 = "1.01 2.23 3.53 4.76"
>>> np.fromstring(s2, dtype=np.float64, sep=" ")
array([ 1.01, 2.23, 3.53, 4.76])
- 各种特殊的二维矩阵,那些上三角矩阵,下三角矩阵之类的。
- **这里是重点!!!!!**对于数组的操作,使用之类的。下面只是一部分,具体见原网站。
>>> x = np.arange(0, 100, 5).reshape(4, 5)
>>> x
array([[ 0, 5, 10, 15, 20],
[25, 30, 35, 40, 45],
[50, 55, 60, 65, 70],
[75, 80, 85, 90, 95]])
>>> x[1,2] #第1行,第2列
35
>>> x[1:4, 3] #第1行到第3行中所有第3列的元素
array([40, 65, 90])
>>> x[:, 4] #所有行中的所有第4列的元素
array([20, 45, 70, 95])
>>> x[0:3, :] #第0行到第三行中所有列的元素
array([[ 0, 5, 10, 15, 20],
[25, 30, 35, 40, 45],
[50, 55, 60, 65, 70]])
2,如何了解数组的维数等信息:https://blog.csdn.net/sunny2038/article/details/9002531 这篇讲的比较细
-
ndarray.ndim:数组的维数(即数组轴的个数),等于秩。最常见的为二维数组(矩阵)。
-
ndarray.shape:数组的维度。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的“行数”和“列数”。ndarray.shape返回一个元组,这个元组的长度就是维度的数目,即ndim属性。
-
ndarray.size:数组元素的总个数,等于shape属性中元组元素的乘积。
-
ndarray.dtype:表示数组中元素类型的对象,可使用标准的Python类型创建或指定dtype。另外也可使用前一篇文章中介绍的NumPy提供的数据类型。
example:
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> b[:,0] # 获取第一列
array([1, 4])
>>> np.array([1,2,3,4])
array([1, 2, 3, 4])
>>> a = np.array([1,2,3,4])
>>> a.dtype # 表示数组中元素类型的对象,可使用标准的Python类型创建或指定dtype。
dtype('int64')
>>> a.ndim #返回的是数组的维度,目前是一维数组。数组的维数(即数组轴的个数),等于秩。
1
>>> a.shape# 返回的是数组的维度。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的“行数”和“列数”。ndarray.shape返回一个元组,这个元组的长度就是维度的数目,即ndim属性。
(4,)
>>> a.reshape(1,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 4 into shape (1,2)
>>> b = a.reshape(2,2)
>>> b
array([[1, 2],
[3, 4]])
>>> b.ndim
2
>>> b.shape
(2, 2)
a = np.array([1,2,3,4,5,6])
>>> b=a.reshape(2,3)# 把b变成3行2列的二维数组!!!!!!!!!如何判断数组是几维,看(2,3)这个元组的长度就行
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> b.ndim
2
>>> b.shape
(2, 3)
>>> b.reshape(6)
array([1, 2, 3, 4, 5, 6]) # 这条很重要!!!!!!!!
>>> c=a.reshape(3,2)
>>> c.ndim
2
>>> c.shape
(3, 2)
2.1 有关reshape方法的一个知识点:Numpy中reshape函数参数-1的含义(https://blog.csdn.net/weixin_39449570/article/details/78619196)
我们不知道z的shape属性是多少,但是想让z变成只有一列,行数不知道多少,通过z.reshape(-1,1)
,Numpy自动计算出有16行,新的数组shape属性为(16, 1),与原来的(4, 4)配套。reshape官方文档介绍: One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.
2.2 arange(),reshape()用法:https://blog.csdn.net/chinacmt/article/details/78548420
具体内容见这篇就行,直接上代码一目了然
3,有关np.load,np.save,以及相关的.npy,.npz文件:https://blog.csdn.net/m0_37041325/article/details/78006203 https://blog.csdn.net/sherrylml/article/details/51494052 (这两篇大同小异)
- np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
- 如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容。
4,有关array,ndarray的区别
https://stackoverflow.com/questions/15879315/what-is-the-difference-between-ndarray-and-array-in-numpy
np.array只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类。你也能够用np.ndarray来创建数组,但这不推荐。Arrays 应该能用array,zeros 或empty来构造…
三,有关类,对象(objective),实例(instance)的理解
class是模子,instance是用模子刻出来的东西
class是共性,instance是基于class的共性实现出来的具体的某个东西(对象)
instance是从class生出来的
最常见的举例是:
类Class:鸟
类的方法(函数):(鸟)会飞
类的属性(变量):爪子,翅膀
实例:
对象:麻雀,是(类Class)鸟 的一种
对象方法(函数):麻雀会飞
对象的变量:麻雀有2个爪子,一对翅膀
四,有关__init__,self的理解
https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/ (这篇讲得非常好!!!!!)
https://www.cnblogs.com/fengyiru6369/p/8287426.html (这篇直接上代码讲述init方法,一目了然)
五,python中数组和列表读取一列的方法(https://blog.csdn.net/songyunli1111/article/details/78109976/)
>>> a=[[1,2,3],[4,5,6]]
>>> a[0] #取一行
[1, 2, 3]
>>> a[:,0] #尝试用数组的方法读取一列失败
TypeError: list indices must be integers or slices, not tuple
>>> b=[x[0] for x in a]
>>> print(b)
[1, 4]
对于数组,则上面的第二个模块有关ndarray讲解有提到。
>>> import numpy as np
>>> a=np.array([[1,2,3],[4,5,6]])
>>> a[:,0]
array([1, 4])
六,python 循环结构(for-in) (https://www.cnblogs.com/kiki5881/p/8541887.html)
把觉得很重要的罗列出来,其余的去网址看:
遍历字典
d = {'a':'apple', 'b':'banana', 'c':'car', 'd': 'desk'}
for key in d:
# 遍历字典时遍历的是键
print(key, d.get(key))
输出:
a apple
b banana
c car
d desk
# for key, value in d.items():
# 上下两种方式等价 d.items() <=> dict.items(d) # 这里很重要!!!!!!!!!!!!!
for key, value in dict.items(d):
print(key, value)
输出跟上面一样, 最好记下面的,经常看到!!!!!!!!!!!!!!!!!
七,generator的理解 http://www.cnblogs.com/xybaby/p/6322376.html
八, 继承,super函数理解
https://www.cnblogs.com/xinghuaikang/p/8481712.html
继承的功能:父类的代码重用
多态的功能:同一方法对不同类型的对象会有相应的结果
开闭原则:对扩展开放,对修改封闭
super类功能:新式类实现广度优先的不重复的调用父类,解决了钻石继承(多继承)的难题
(要理解mro中的C3算法):https://blog.csdn.net/mystyle_/article/details/77619416?utm_source=blogxgwz1
https://blog.csdn.net/u011467553/article/details/81437780
个人理解:
1.调用了父类的方法,出入的是子类的实例对象
2.新式类子类(A,B),A就在B之前
3.super类似于嵌套的一种设计,当代码执行到super实例化后,先去找同级父类,若没有其余父类,再执行自身父类,再往下走,
简洁点的三个原则就是:
子类在父类前,所有类不重复调用,从左到右
九,容器,可迭代对象,迭代器,生成器
- 1,容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
- 2,可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
- 3,迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
- 4,生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。
十 python中@classmethod @staticmethod区别
https://www.cnblogs.com/elie/p/5876210.html
Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式.
class A(object):
def foo(self, x):
print("executing foo(%s,%s)" % (self, x))
print('self:', self)
@classmethod
def class_foo(cls, x):
print("executing class_foo(%s,%s)" % (cls, x))
print('cls:', cls)
@staticmethod
def static_foo(x):
print("executing static_foo(%s)" % x)
a = A()
普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。 @classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。
self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。
问题:@staticmethod修饰的方法函数与普通的类外函数,为什么不直接使用普通函数?
@staticmethod是把函数嵌入到类中的一种方式,函数就属于类,同时表明函数不需要访问这个类。通过子类的继承覆盖,能更好的组织代码。