python(杂)不定时更新

    技术2024-07-02  83

    记录遇到的一些问题以及知识点。。菜鸟一只,有问题欢迎批评指正。

    cuda上面的变量类型只能是tensor,不能是其他的类型。、将cuda上的tensor转换为numpy: >>>A.cpu().detach().numpy() #转换为cpu模式,截断梯度反向传播,转numpy

    二、ndarray

    numpy: 可采用ones/ zeros/ eye/ diag/ random.randint等创建矩阵对于ndarray求和如: >>>a = np.random.randint(0,30,(2,3)) >>> a array([[22, 11, 1], [ 8, 21, 27]]) >>> l = [] >>> l.append(a) >>> l [array([[22, 11, 1], [ 8, 21, 27]])] >>> b = np.random.randint(0,30,(2,3)) >>> b array([[16, 5, 16], [18, 7, 25]]) >>> l.append(b) >>> c = np.random.randint(0,30,(2,3)) >>> l.append(c) >>> l [array([[22, 11, 1], [ 8, 21, 27]]), array([[16, 5, 16], [18, 7, 25]]), array([[17, 15, 0], [24, 29, 20]])] >>> sum(l) array([[55, 31, 17], [50, 57, 72]]) >>> sum(l)/6 array([[ 9.16666667, 5.16666667, 2.83333333], [ 8.33333333, 9.5 , 12. ]]) 查看array中是否有nan(Not A Number,任何与nan相关的计算都返回nan)

    查看是否为nan值:True为nan

    >>> np.isnan(array)

    判断array中有无nan值:np.isnan(array).any()。 1> .any():如果所有元素均为空、0、false,则返回False,否则为True。(有一个真"True",则真"True";所有元素均假"False",才假"False")

    >>> np.array([0,1,2,3]).any() True >>> np.array([6,1,2,3]).any() True >>> np.array([0,0,0,0]).any() False

    2> .all():可判断array中有无为False的元素(0、空、None、False均为False),如果有,则为False,否则为True.(所有均真"True",才真"True";有一个元素假"False",则假"False")

    >>> np.array([6,1,2,3]).all() True >>> np.array([0,1,2,3]).all() False >>> np.array([0,0,0,0]).all() False

    np.repeat,np.tile()复制

    array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。即当源array被改变,由array得到的矩阵不会改变(两者所占内存不同),而ndarray得到的矩阵会发生改变。

    行连续指数组中同一行相邻元素在内存中的位置也是相邻的(内存地址实际为一维)。Numpy中,随机初始化的数组默认都是C连续的,经过不规则的slice操作,则会改变连续性,可能会变成既不是C连续,也不是Fortran连续的。 Numpy可以通过.flags熟悉查看一个数组是C连续还是Fortran连续的。 若数组不连续,可利用copy()创建一个连续的副本

    将numpy扩展维数:

    >>>A = np.array([1,2,3]) >>>A[:,None] array([[1],[2],[3]]) #不改变A本身维度 >>>#np.hstack([A[:, None]]) #array([[1],[2],[3]])

    三、tensor

    1>

    >>>torch.mm(A,B) #矩阵A,B相乘(只用于二维)高维应用torch.matmul() >>>torch.mul(A,B) #矩阵A,B对应位相乘,矩阵维度不同时会自动填充 >>>torch.randn(2,3) #生成2X3的正态分布的的tensor >>>torch.mean() #求均值,可指定维度 >>>torch.pow(A,n) #对A中各元素求n次幂 >>>torch.add(A,n) #A中各元素值均加n;torch.add(A,n,b)A中各元素加n*b >>>torch.div(A,B) #或torch.div(A,n)前者为两张量对应位相除,后者为A逐位除标量n >>>torch.exp(a) #指数

    2>

    >>> a tensor([[ 9, 24, 10, 17], [27, 27, 22, 19]]) >>> a.select(0, 0) tensor([ 9, 24, 10, 17]) >>> a.select(0, 1) tensor([27, 27, 22, 19]) >>> a.select(1, 0) tensor([ 9, 27]) >>> a.narrow(1, 1, 1) tensor([[24], [27]]) >>> a.narrow(1, 0, 1) tensor([[ 9], [27]]) >>> a.narrow(1, 0, 0) tensor([], size=(2, 0), dtype=torch.int64) >>> a.narrow(0, 1, 0) tensor([], size=(0, 4), dtype=torch.int64) >>> a.narrow(0, 1, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: start (1) + length (3) exceeds dimension size (2). >>> a.narrow(0, 0, 1) tensor([[ 9, 24, 10, 17]])

    四、nan

    可以利用nan != nan的性质来查找nan. >>> np.nan != np.nan True >>> (W != W).sum() #不为0则nan值存在 np.isnan(A)可判断A是否为nan值;(类似的,np.isinf(A)可判断A是否为inf)

    参考

    Pytorch入门学习(九)—detach()的作用(从GAN代码分析)numpy中array和asarray的区别从Numpy中的ascontiguousarray起
    Processed: 0.024, SQL: 9