【知识点合辑】numpy+torch+latex+jupyter notebook+python+Windows字典

字典式文章,只是为了方便查找

numpy

1. numpy.linalg.norm

功能:计算两个向量之间的L2距离(或L2范式)
公式: ∑ p ( I p 1 − I p 2 ) \sqrt{\sum_p{(I_p^1-I_p^2)}} p(Ip1Ip2)
用法:

dist = np.linalg.norm(X[i]-self.X_train[j])

等价于:

dist = np.sqrt(np.sum(np.square(X[i]-self.X_train[j])))

2. numpy.flatnonzero

功能:返回输入数组的非0元素的索引
用法:略

3. numpy.squeeze

功能:对向量进行级联操作
用法:指定向量(以序列形式出现)和维度即可

np.hstack((a,b), 0)

4. np.maximum

功能:数组中元素大于0的元素保持不变,其余变为0;相当于是max(a, 0)的操作
用法:

np.maximum(a, 0)

备注:需要与np.max做区分,np.maximum是逐元素比较两个array,np.max是找一个array中的最值

5. numpy.argsort

功能:对数组进行排序(升序),然后按照顺序返回索引数组
用法:

avgDists.argsort()[:n] # 取出前n个小的数据的索引
(-avgDists).argsort()[:n] # 逆序排列并取出前n个

备注:arg这个前缀在numpy中是取索引的意思,类似的还有np.argmax()是返回数组最大值的索引

6. numpy复制并扩充维度

函数1:

np.expand_dims(a,0).repeat(1000,axis=0)

函数2:

a[np.newaxis, :].repeat(1000,axis=0)

详细说明下2:

>>> x
array([0, 1, 2, 3])

>>> x[np.newaxis, :]
array([[0, 1, 2, 3]])

>>> x[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3]])

7. numpy.array_split

功能:将一个array平均分为好几个存储为list
用法:

X_list = np.array_split(X, 3)

8. numpy.delete

功能:沿着某个axis删除某个array中的obj
用法:

>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> np.delete(arr, 1, 0)
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])

9. numpy.random.choice

功能:从某个范围中随机选择元素(可用在数据集中为每个batch选取样本时,返回的是样本的索引)
用法:

np.random.choice(5, 3) # 从0~4中选择3个数

10. numpy.prob

功能:计算所有元素的乘积
用法:

a = np.prob([1., 3.]) # a = 3

11. numpy.linspace

功能:等分某个间隔,返回array(可用于超参数的调整)
用法:

np.linspace(2.0, 3.0, num=5) # 包括右节点
>>> array([2.  , 2.25, 2.5 , 2.75, 3.  ])

12. numpy.log

功能:取对数(e为底数,而非我们日常使用的10为底数的log)

13. numpy.hstack和numpy.vstack

功能:从竖直维度(1维度)和0维度对多个array(以tuple形式传递)进行级联
用法:

np.hstack((a,b))

14. numpy.ones

用法:

np.ones((2, 1))

15. numpy.add.at

其实现在也搞得不是很懂,这里先贴一个别人的总结,之后好好研读下:np.add.at的使用心得与python的广播机制
用法:在word embedding层的反向传播中很有用,其中x表示embedding层的输入(也就是句子中单词对应的index),W表示word vector矩阵,out表示embedding层的输出,N为样本数,T为句子最大长度,D为word embedding维度,V为整个词汇表的长度,变量维度及np.add.at用法和理解如下:

#x: (N,T)
#dW: (V,D)
#dout: (N,T,D)
np.add.at(dW,x,dout)
#类似如下过程
for row inr range(N)for col in range(T):
		dW[x[row,col],:] +=dout[row,col,:]

16. numpy.concatenate((a1, a2, …), axis=0)

将多个变量在维度0上进行级联

17. numpy.asarray

将结构数据转化为ndarray
与np.array的不同:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)
def array(a, dtype=None, order=None):
    return array(a, dtype, copy=True, order=order)

np.array(默认情况下)将会copy该对象
但是好像从np.array换到np.asarray也并没有快多少…

torch

1. torch.randperm(n)

返回一个从1到n-1的整数的随机排列

2. torch.nonzero(input, *, out=None, as_tuple=False)

当as_tuple为默认值False时,返回一个2-D向量,每一行的值代表input中非零值对应的索引

3. torch.argmin(input, dim=None, keepdim=False)

返回input中最小值对应的索引

4. torch.unsqueeze(input, dim)

给input在dim维度位置加一个新维度

5. torch.index_select(input, dim, index, *, out=None)

使用index在input的dim维度上进行筛选,返回len(index)个input实例

6. torch.Tensor.min(dim)

返回dim维度上的最小值

7. torch.nn.functional.softmax

只需要记住softmax的公式就可以了: S o f t m a x ( x i ) = e x p ( x i ) ∑ j e x p ( x j ) Softmax(x_i) = \frac{exp(x_i)}{\sum_j exp(x_j)} Softmax(xi)=jexp(xj)exp(xi)

8. torch.nn.functional.cosine_similarity(vec1, vec2, dim)

计算两个向量的余弦相似性。公式:
s i m i l a r i t y = x 1 x 2 m a x ( ∣ ∣ x 1 ∣ ∣ 2 ∣ ∣ x 2 ∣ ∣ 2 ) similarity = \frac{x_1 x_2}{max(||x_1||_2||x_2||_2)} similarity=max(x12x22)x1x2

9. list转Tensor

torch.Tensor(list)

10. numpy.array转Tensor

torch.from_numpy(npar)

11. 取指数、对数运算

torch.exp()
torch.log()

12. IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

一般遇到这个bug的话,需要具体问题具体分析,看看是哪个函数导致的bug,我是用torch.nn.functional.cosine_similarity(vec1, vec2, dim)时出现的bug,其中vec1维度是 1536 , 1536, 1536,, vec2维度是 500 , 1536 500,1536 500,1536,dim为 1 1 1,我的目标是得到500个相似度。这里很神奇,windows上面跑就不会报错,而放到linux上跑,就会报IndexError这个错误,所以在linux上,需要写为torch.nn.functional.cosine_similarity(vec1.unsqueeze(0), vec2, dim=0),也就是对vec1扩充一个0维度

13. torch.mul

对两个矩阵进行逐元素的相乘

14. torch.nn.parameter.Parameter(data)

当你的网络中要学习的参数不是线性层、卷积层、LSTM层这种常规网络的参数时,就可以设置一个parameter,其中的data有两种定义形式,第一种是直接定义现成的torch.Tensor,第二种是像大多数网络一样定义某种维度的随机数torch.randn()。有个博客写得很好:PyTorch中的torch.nn.Parameter() 详解

15. torch.nn.functional.kl_div(input, target)

需要注意,input要输入取过对数log之后的,如果是原始预测概率分布,就torch.log一下。以及,target常理来说需要是ground truth,也就是需要定住不变了,否则应该是学不成的(具体能不能学成还没有试过)。具体的计算过程可以看:相对熵(KL散度)计算过程。而torch.nn.functional.kl_div和orch.nn.KLDivLoss其实是一样的东西,前者使用起来更轻量

16. torch.Tensor.contiguous()

把一个变量在内存中变为连续的(一般用于 transpose/permute 后和 view 前,即使用 transpose 或 permute 进行维度变换后,调用 contiguous,然后方可使用 view 对维度进行变形(如:tensor_var.contiguous().view() ),参考PyTorch torch.Tensor.contiguous() 用法与理解

17. torch.clamp(input, min=None, max=None)

把输入的变量固定在min和max之间

18. torch.numel(input)

返回输入向量的总元素数

19. torch.nn.BCEWithLogitsLoss

一个类,将sigmoid函数和bce损失组合在一起的类,这样用比分别用sigmoid和bce更加稳定

20. torch.mul

逐元素相乘

21. torch.nn.functional.softmax(input,dim=None)

公式: s o f t m a x ( x i ) = e x p ( x i ) ∑ j e x p ( x j ) softmax(x_i) = \frac{exp(x_i)}{\sum_jexp(x_j)} softmax(xi)=jexp(xj)exp(xi)
当dim为-1的时候,就是在最后一个维度上进行softmax

22. tensor转化为int

直接int()不行,先tensor.item()再int()

23. tensor维度中使用None

相当于torch.unsqueeze(),如:

import torch
tensor = torch.randn(3, 4)
print('tensor size:', tensor.size())
tensor_1 = tensor[:, None]
print('tensor_1 size:', tensor_1.size())
tensor_2 = tensor[:, :, None]
print('tensor_2 size', tensor_2.size())

>>> tensor size: torch.Size([3, 4])
>>> tensor_1 size: torch.Size([3, 1, 4])
>>> tensor_2 size torch.Size([3, 4, 1])

24. torch.logsumexp()

如名所示,先exp,再sum,再log

25. torch.eye(n, m=None)

返回n维对角线为1其他为0的方阵(若m指定了值,则是n行m列的矩阵,多出来的行/列为0)

26. torch.nn.functional.softplus(input)

softplus激活函数,公式: S o f t p l u s ( x ) = 1 β ∗ l o g ( 1 + e x p ( β ∗ x ) ) Softplus(x) = \frac{1}{\beta}*log(1+exp(\beta*x)) Softplus(x)=β1log(1+exp(βx))

27. model.eval()

不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化,pytorch框架会自动把BN和Dropout固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层影响结果

28. AttributeError: ‘DataParallel’ object has no attribute ‘****’

model被DataParallel化之后,对象类型发生了变化,变成了module类,所以再使用model的某些方法或属性时时,需要加上model.module.xxxx

latex

1. Undefined control sequence

具体bug忘记copy了,当时错误现实出现在\toprule附近,这是因为没有导入需要的包:

\usepackage{booktabs}

2. \textbf{文本}不起作用

也是因为缺包:

\usepackage[T1]{fontenc}

3. itemize的间距过大

在导言区进行全局设置:

\usepackage{enumitem}
\setenumerate[1]{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=5pt}
\setitemize[1]{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=5pt}
\setdescription{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=5pt}

4. \vspace使用方法

在图、表、公式的\begin后添加:

\vspace{-2mm}

代表空隙减少2mm

5. TexStudio中实现多行注释

简单做法
选中要注释的:

Ctrl + T

反注释:

Ctrl + T
or
Ctrl + U

复杂做法
开头位置加包:

\usepackage{verbatim}

想要注释的位置:

\begin{comment} 
内容
\end{comment}

6. 给表格减小字号

在表格的\begin后添加:

\footnotesize

代表减小为脚注字号

7. 合并单元格之一行多列

\multicolumn{NUMBER_OF_COLUMNS}{ALIGNMENT}{CONTENT}

例如:

\multicolumn{6}{c|}{CONTENT}

代表合并一行中的6列为一个单元格,内容为CONTENT,以居中的形式,右侧加上一个斜杠

8. 图/表横框双栏

只需要将:

\begin{figure}
 content
\end{figure}

改为

\begin{figure*}
 content
\end{figure*}

对表格也是一样

9. 加入algorithm后报“出现错误”

没有引入包:

\usepackage{algorithm}
\usepackage{algorithmic}

10. 出现错误

有时候报错只是“出现错误”,并没有其他报错信息,这种情况多半是没有引入包

11. 加hat( x ^ \hat{x} x^)符号

\hat{x}

jupyter notebook

1. 导出为pdf

如果在浏览器中打开jupyter的话,就会发现将.ipynb文件以很多种形式导出,然而导出为pdf的话经常失败,建议先导出为md文件,然后用Typora打开,再导出为pdf就比较方便了

2. 终止某个正在运行的cell

直接点Interrupt符号就可以,之前一直以为这个符号就是中断整个jupyter kernel,所以中断之后会把之前运行过的cell全都重新运行一遍,后来发现不需要

3. %用法

功能:行魔法函数,只对本行代码生效(表示不太懂什么叫只对本行代码生效)
用法:
在这里插入图片描述
比较常见的就是其中的%matplotlib inline,这样运行后,以后使用plt生成的图片就不会再弹出一个对话框来显示了

4. 三种cell类型

  • Code(编辑代码,运行后显示代码运行结果)
  • Markdown(编写Markdown文档,运行后输出Markdown格式的文档) (从运行状态返回编辑状态,只需要双击)
  • Raw NBConvert(普通文本,运行不会输出结果)

python

1. 匿名函数

lambda arguments: expression
功能:用一行代表一个函数
用法:

double = lambda x: x * 2
print(double(5))

输出:

10

2. pass 语句

空语句,是为了保持程序结构的完整性。如果定义了某函数,但还没想好该怎么写,就在函数体中加入pass

3. 将True/False转为1/0

这个看似小小的问题困扰了我好久:

a = b > 0

我的目标是要把b中大于0的位置赋值为1,其余为0,但是这种方式得到的结果是True/False,网上有人给出的答案是:

a = b > 0 + 0

然而并没有成功,最后的方案是:

a = (b > 0).astype('float')

4. dict.pop()

功能:使用某个key从一个dict中排除并返回一个元素
用法:

# create a dictionary
marks = { 'Physics': 67, 'Chemistry': 72, 'Math': 89 }

element = marks.pop('Chemistry')

print('Popped Marks:', element)

# Output: Popped Marks: 72

5. dict.setdefault()

功能:若某个key不存在于字典中,将会添加此key并将值设为默认值
用法:

dict.setdefault(key, default=None)

6. * 和 **

功能:*args 和 **kwargs 主要用于一次传递多个参数,前者本质是个tuple,后者是个dict

7. range倒序

优雅:reversed(range(T))
笨拙:range(100,0,-1)

8. python环境的包存在哪里

首先找到环境位置,比如我的环境是D:\env\pt,则包存在:

D:\env\pt\Lib\site-packages

9. operands could not be broadcast together with shapes

m = x - y # x: (500, 500), y: (500, )

直觉来说,x, y这两个矩阵可以通过广播相减的,但仍然报错operands could not be broadcast together with shapes

只需要:

y = np.expand_dims(y, 1)

10. List Comprehensions

成为列表推导式吧,其实感觉就是把for循环写到一行里了,不过听说这种方式更快,仔细研究的话可以看看官网解释和一个经典实例

11. 读取json文件

import json
file = open('xx.json', 'r')
data = json.load(file)
file.close()

or

import json
with open('xx.json', 'r') as file:
	data = json.load(file)

12. TypeError: tensor is not JSON serializable

此bug的具体原因不详,但是可以把保存的tensor转化为np.array类型或者list类型再保存到json中

13. Resource u’tokenizers/punkt/english.pickle’ not found

这是在使用nltk包时遇到的问题,这是因为原本nltk下载的依赖文件不见了,这是可以重新打开一个py文件,写入:

import nltk
nltk.download()

然后就可以在/home/user/nltk下找到punkt/english.pickle这个资源了(linux系统下)

14. math.log()

math包中的对数函数,这里的对数是自然对数,不是计算器上的以10为底的对数

15. action=“store_true”

可以简单理解为,这是为参数指定一个动作(在cmd中声明它),当发生这个动作的时候,就将这个参数存储为’_'后的值;当不发生这个动作的时候,就将其存储为默认值;若是没有指定默认值,若是store_true,默认值就是false,若是store_false,默认值就是true

16. 类的继承

当一个类继承了另一个类,就是继承了它的参数和方法,可以直接使用,也可以改写

17. zip及反用法

zip()可将两个列表中的元素一一对应打包成一个元组列表,如:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]

同时,也可以把打包好的元组列表拆开为两个普通列表:

>>> c = [(1, 'x'), (2, 'y'), (3, 'x'), (4, 'w')]
>>> a, b = zip(*c)
>>> a(1, 2, 3, 4)
>>> b('x', 'y', 'x', 'w')

18. linux上通过pip命令安装的python的库安装在哪里

/usr/local/lib/python3.7/site-packages

19. [::-1]

顺序相反操作

20. 函数中定义函数

def paint():
    print("paint")
    def paintA():
        print("paintA")
    paintA()
paint()
//输出如下:
//paint
//paintA

其实就是按照正常的逻辑执行

21. call()方法

该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。

class CLanguage:
    # 定义__call__方法
    def __call__(self,name,add):
        print("调用__call__()方法",name,add)
clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")

22. @property与@*.setter装饰器

@property可以单独使用,使得类中的方法可以被当作类的属性一样取值
@*.setter必须要与@property成对使用,且*必须与@property修饰的函数对象保持名称一致,使得类中的方法可以被当作类的属性一样赋值
具体参考python中@property与@*.setter的使用

23. 扩展list

当只加一个数的时候,可以用list.append(x)
当再加一个列表时,使用list.extend(list2)

24. Pycharm中报错:Empty test suite

可能是因为此时运行的文件以test开头,改掉就好了

25. python的内存释放

import gc (garbage collector)
del a
gc.collect()

26. SyntaxError: Non-ASCII character ‘\xe7’ in file

表示python编码错误,当有中文输出或注释时出现
解决方案:在Python源文件的最开始一行,加入,

#coding=UTF-8

27. ImportError: cannot import name ABC

这是由于当前使用的python环境版本是2.x(python3.x时不会出现)

改为import ABCMeta

28. python2.x安装nltk

pip install nltk是不行的,因为默认下载最高版本,与python2.x不兼容。正确方案:

pip install nltk==3.4.5

29. python2.x安装opencv-python

pip install opencv-python是不行的,会报错TypeError: 'NoneType' object is not iterable。正确方案:

pip install opencv-python==4.2.0.32

30. import任意路径下的b.py文件

import sys
sys.path.append("/data/to/path/")
import b

31. list中使用for循环(加入if条件)

参考在python的List中使用for循环语句的技巧汇编

32. python中取json文件的key

with open('./source_file/info.json','r',encoding='utf8')as fp:
    json_data = json.load(fp)
    for key in json: # 取出来的key就是json文件的键
    	value = json_data[key] # value即是当前key对应的值

33. No module named ‘cv2’

pip install opencv-python

34. No module named ‘sklearn.metrics.cluster.supervised’

八成是pip install sklearn了,应该是pip install scikit-learn

35. char、int、long、float、double所占内存

参考char、int、long、float、double等在64位下占多少字节

Windows

1. 查看显存

任务栏右键->任务管理器->性能->GPU

2. 跳转文件夹位置命令

跳转到其他盘符:

D:

跳转到相同盘符下的某个文件夹

cd D:\WINDOWS

3. 查看cuda版本

nvcc --version

nvidia-smi

但是有时候这两个cuda版本会不一样,为啥不一样我还没搞清楚,可以参考csdn回答

4. cmd中出现git 不是内部或外部命令,也不是可运行的程序

参考Windows下配置Git ,“git 不是内部或外部命令,也不是可运行的程序 ”解决方案

5. github desktop中报错Newer commits on remote

(血泪教训:千万别用git命令来提交代码到repo,会遇到各种各样新奇的报错,直接用github desktop)
报错具体信息:

Newer commits on remote:

Desktop is unable to push commits to this branch 
because there are commits on the remote that are not present on your local branch. 
Fetch these new commits before pushing in order to reconcile them with your local commits.

桌面无法将push到该分支
因为远程上有一些 commits 在本地分支上不存在。
在push之前先获取这些新 commits ,以使其与本地提交保持一致。

意思是在push之前,远程的部分可能已经被改过了,所以你先同步一下你本地的东西,再push。所以乖乖地点下边的 Fetch 即可

6. 安装git

依照官网命令就好了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值