代码中的点点记录(积累的力量)

声明:内容大部分非原创,主要是为记录下来,方便反复理解

1、assert 使用实例

assert True     # 条件为 true 正常执行
assert False    # 条件为 false 触发异常
assert 1==2, '1 不等于 2'
AssertionError: 1 不等于 2

2、os.path.exists

os.path.exists(path) 	路径存在则返回True,路径损坏返回False
os.path.lexists 	路径存在则返回True,路径损坏也返回True

3、format

{} {}".format("hello", "world") 

4、数据类型转换

arr = arr.astype(int)

5、map

map() 会根据提供的函数对指定序列做映射

string_date='2020-1-1'
year,month,day=map(int,string_date.split('-'))

6、@classmethod

classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。作用就是“可以不需要实例化,直接类名.方法名()来调用"

class A(object):
    bar = 1
    def func1(self):  
        print ('foo') 
    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

7、@staticmethod

staticmethod用于修饰类中的方法,使其可以在不创建类实例的情况下调用方法,这样做的好处是执行效率比较高。当然,也可以像一般的方法一样用实例调用该方法。该方法一般被称为静态方法。静态方法不可以引用类中的属性或方法,其参数列表也不需要约定的默认参数self

class Time():
    def __init__(self,sec):
        self.sec = sec
    #声明一个静态方法
    @staticmethod
    def sec_minutes(s1,s2):
        #返回两个时间差
        return abs(s1-s2)

t = Time(10)
#分别使用类名调用和使用实例调用静态方法
print(Time.sec_minutes(10,5),t.sec_minutes(t.sec,5))

8、python中的del用法

del语句作用在变量上,而不是数据对象上。

    if __name__=='__main__':  
        a=1       # 对象 1 被 变量a引用,对象1的引用计数器为1  
        b=a       # 对象1 被变量b引用,对象1的引用计数器加1  
        c=a       #1对象1 被变量c引用,对象1的引用计数器加1  
        del a     #删除变量a,解除a对1的引用  
        del b     #删除变量b,解除b对1的引用  
        print(c)  #最终变量c仍然引用1  

del删除的是变量,而不是数据。

    if __name__=='__main__':  
        li=[1,2,3,4,5]  #列表本身不包含数据1,2,3,4,5,而是包含变量:li[0] li[1] li[2] li[3] li[4]   
        first=li[0]     #拷贝列表,也不会有数据对象的复制,而是创建新的变量引用  
        del li[0]  
        print(li)      #输出[2, 3, 4, 5]  
        print(first)   #输出 1  

9、random.sample() 和 random.choice()区别

random.sample() 和 random.choice() 的优点都是可以指定抽样的个数,一次性从列表中不重复地抽样出指定个数的元素,其中 random.sample()默认就是不重复抽样(不放回的抽样),而random.choice()默认是可以重复抽样,要想不重复地抽样,需要设置replace参数为False,用法如下:

从速度上看,当抽样数量小的时候,random.sample方法比random.choice方法快很多;当抽样数量很大的时候,random.sample方法就不如random.choice方法了。

10、PyTorch 中的scatter() 函数

scatter(dim, index, src) 的参数有 3 个

dim:沿着哪个维度进行索引
index:用来 scatter 的元素索引 src:用来 scatter 的源元素,可以是一个标量或一个张量

这个 scatter 可以理解成放置元素或者修改元素

简单说就是通过一个张量 src 来修改另一个张量,哪个元素需要修改、用 src 中的哪个元素来修改由 dim 和 index 决定

x = torch.rand(2, 5)

tensor([[0.1940, 0.3340, 0.8184, 0.4269, 0.5945],
        [0.2078, 0.5978, 0.0074, 0.0943, 0.0266]])

index = torch.tensor([[0, 1, 2, 0, 0], 
                      [2, 0, 0, 1, 2]])
                      
这个index里面存放的是y的索引,index自己的索引对应的是x的索引,在index的某个位置上第一步取出y的索引,第二步取出x对应位置的内容,y的索引的位置存放的就是x的内容。

y = torch.zeros(3, 5).scatter_(0, index, x)

tensor([[0.1940, 0.5978, 0.0074, 0.4269, 0.5945],
        [0.0000, 0.3340, 0.0000, 0.0943, 0.0000],
        [0.2078, 0.0000, 0.8184, 0.0000, 0.0266]])

可以这样理解:
dim = 0的意思是,index中存放的是dim =0维度上的坐标,由于是二维向量,dim=1维度上的坐标,和index的相同。

index[0][0] = 0
y[index[0][0]][0] = y[0][0] = x [0][0] = 0.1940
index[1][0] = 2
y[index[1][0]][0] = y[2][0] = x [1][0] = 0.2078

index[0][1] = 1
y[index[0][1]][1] = y[1][1] = x [0][1] = 0.3340
index[1][1] = 0
y[index[1][1]][1] = y[0][1] = x [1][1] = 0.5978

index[0][2] = 2
y[index[0][2]][0] = y[0][2] = x [0][2] = 0.8184
index[1][2] = 0
y[index[1][2]][0] = y[2][2] = x [1][2] = 0.0074

index[0][3] = 0
y[index[0][3]][0] = y[0][3] = x [0][3] = 0.4269
index[1][3] = 1
y[index[1][3]][0] = y[1][3] = x [1][3] = 0.0943

index[0][4] = 0
y[index[0][4]][0] = y[0][4] = x [0][4] = 0.5945
index[1][4] = 2
y[index[1][4]][0] = y[2][4] = x [1][4] = 0.0266

scatter() 一般可以用来对标签进行 one-hot 编码,这就是一个典型的用标量来修改张量的一个例子

class_num = 10
batch_size = 4
label = torch.LongTensor(batch_size, 1).random_() % class_num
#tensor([[6],
#        [0],
#        [3],
#        [2]])
torch.zeros(batch_size, class_num).scatter_(1, label, 1)
#tensor([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
#        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]])

11、panda中的数据类型转换

  • 如果数据是纯净的数据,可以转化为数字

  • astype基本也就是两种用作,数字转化为单纯字符串,单纯数字的字符串转化为数字,含有其他的非数字的字符串是不能通过astype进行转化的。

  • 需要引入其他的方法进行转化,也就有了下面的自定义函数方法

def convert_currency(var):
    """
    convert the string number to a float
    _ 去除$
    - 去除逗号,
    - 转化为浮点数类型
    """
    new_value = var.replace(",","").replace("$","")
    return float(new_value)

# 通过replace函数将$以及逗号去掉,然后字符串转化为浮点数,
#让pandas选择pandas认为合适的特定类型,float或者int,该例子中将数据转化为了float64
# 通过pandas中的apply函数将2016列中的数据全部转化
df["2016"].apply(convert_currency)

#或者
df["2016"].apply(lambda x: x.replace(",","").replace("$","")).astype("float64")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值