Pytorch框架学习路径(一:张量简介与创建)

学习课程来自深度之眼。

张量是什么?

在这里插入图片描述

Variable数据类型

理解Variable对理解张量是很有帮助的。
Variable是torch.autograd中的数据类型主要用于封装Tensor,让tensor能够进行自动求导。
在这里插入图片描述在这里插入图片描述

张量的创建

Tensor创建一:直接创建

torch.tensor创建张量

在这里插入图片描述

1、通过torch.tensor创建张量
# ===============================  example 1 ===============================
# 通过torch.tensor创建张量
#
flag = True
# flag = False
if flag:
    arr = np.ones((3, 3))
    print("ndarray的数据类型:", arr.dtype)
	
    t_gpu = torch.tensor(arr, device='cuda') # 把数据从cpu转到gpu(这个过程需要一定的时间)
    t = torch.tensor(arr)

    print("t_gpu:{}\nt:{}".format(t_gpu, t))
    # print(t)

在这里插入图片描述

torch.from_numpy创建张量

在这里插入图片描述

2、通过torch.from_numpy创建张量
# ===============================  example 2 ===============================
# 通过torch.from_numpy创建张量
flag = True
# flag = False
if flag:
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    t = torch.from_numpy(arr)
    print('1_1_1_'*20)
    print("numpy array: ", arr)
    print("tensor : ", t)

    print('\n')
    print('2_2_2_'*20)
    print("修改arr")
    arr[0, 0] = 0
    print("numpy array: ", arr)
    print("tensor : ", t)

    print('\n')
    print('3_3_3_' * 20)
    print("修改tensor")
    t[0, 0] = -1
    print("numpy array: ", arr)
    print("tensor : ", t)

OUT: 通过以下输出结果可以看出:从tor c h .f r om_ n u mp y 创建的te n sor于原n darr ay共享内存,当修改其中一个的数据,另外一个也将会被改动

1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_
numpy array:  [[1 2 3]
 [4 5 6]]
tensor :  tensor([[1, 2, 3],
        [4, 5, 6]], dtype=torch.int32)


2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_
修改arr
numpy array:  [[0 2 3]
 [4 5 6]]
tensor :  tensor([[0, 2, 3],
        [4, 5, 6]], dtype=torch.int32)


3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_
修改tensor
numpy array:  [[-1  2  3]
 [ 4  5  6]]
tensor :  tensor([[-1,  2,  3],
        [ 4,  5,  6]], dtype=torch.int32)

Tensor创建二:依据数值创建

torch.zeros()

在这里插入图片描述在这里插入图片描述

3、通过torch.zeros创建全为0张量
# ===============================  example 3 ===============================
# 通过torch.zeros创建张量
flag = True
# flag = False
if flag:
    out_t = torch.tensor([1])

    t = torch.zeros((3, 3), out=out_t)

    print(t, '\n', out_t)
    # print(id(t), id(out_t), id(t) == id(out_t))
    print("t的内存地址 :{}\nout_t的内存地址 :{}\nt和out_t的内存地址是否相同 :{}".format(id(t), id(out_t), id(t) == id(out_t)))

OUT:

tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]) 
 tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
t的内存地址 :2703282791352
out_t的内存地址 :2703282791352
t和out_t的内存地址是否相同 :True

torch.zeros_like()和torch.ones()

torch.zeros_like()和torch.ones()这两种用法和torch.zeros()相同,不再举例说明。
在这里插入图片描述
在这里插入图片描述

torch.full()

在这里插入图片描述

4、通过torch.full创建全1张量
# ===============================  example 4 ===============================
# 通过torch.full创建全1张量
flag = True
# flag = False
if flag:
    t = torch.full((3, 3), 1.)  # 1.6之后若不指定dtype,就需要传入浮点数
    print(t)

OUT:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

Tensor创建三:依据概率创建

torch.arange()

在这里插入图片描述

5、通过torch.arange创建等差数列张量
# ===============================  example 5 ===============================
# 通过torch.arange创建等差数列张量
flag = True
# flag = False
if flag:
    t = torch.arange(2, 10, 2)
    print(t)

OUT:

tensor([2, 4, 6, 8])

torch.logspace()

在这里插入图片描述

6、通过torch.linspace创建均分数列张量
# ===============================  example 6 ===============================
# 通过torch.linspace创建均分数列张量
flag = True
# flag = False
if flag:
    # t = torch.linspace(2, 10, 5)
    t = torch.linspace(2, 10, 6)
    print(t)

OUT:

tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])

torch.logspace()

在这里插入图片描述

torch.eye()

在这里插入图片描述

torch.normal()

在这里插入图片描述

7、通过torch.linspace创建均分数列张量
# ===============================  example 7 ===============================
# 通过torch.normal创建正态分布张量
flag = True
# flag = False
if flag:

    # mean:张量 std: 张量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t_normal = torch.normal(mean, std)
    print('1_1_1_' * 20)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)

    # mean:标量 std: 标量
    t_normal = torch.normal(0., 1., size=(4,))
    print('2_2_2_' * 20)
    print(t_normal)

    # mean:张量 std: 标量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = 1
    t_normal = torch.normal(mean, std)
    print('3_3_3_' * 20)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)

OUT:

# ===============================  example 7 ===============================
# 通过torch.normal创建正态分布张量
flag = True
# flag = False
if flag:

    # mean:张量 std: 张量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t_normal = torch.normal(mean, std)
    print('1_1_1_' * 20)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)

    # mean:标量 std: 标量
    t_normal = torch.normal(0., 1., size=(4,))
    print('2_2_2_' * 20)
    print(t_normal)

    # mean:张量 std: 标量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = 1
    t_normal = torch.normal(mean, std)
    print('3_3_3_' * 20)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)

OUT:

1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_
mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([1.6614, 2.5338, 3.1850, 6.4853])

2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_
tensor([-0.4519, -0.1661, -1.5228,  0.3817])

3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_
mean:tensor([1., 2., 3., 4.])
std:1
tensor([-0.0276,  1.4369,  2.1077,  3.9417])

随机生成Tensor

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、通过torch.rand和torch.randn随机生成张量

问题:torch.rand和torch.randn有什么区别?
一个均匀分布,一个是标准正态分布。

# ===============================  example 7 ===============================
# torch.rand和torch.randn
flag = True
# flag = False
if flag:
    # rand(*size, out=None, dtype=None)
    t1 = torch.rand(2, 3)
    print('1_1_1_' * 20)
    print("t1:{}\nt1.type:{}".format(t1, t1.type()))

    # randn(*size, out=None, dtype=None)
    # randn_like(input, dtype=None)
    t2 = torch.randn(2, 3)
    t3 = torch.randn_like(t1)
    print('\n')
    print('2_2_2_' * 20)
    print("t2:{}\nt2.type:{}".format(t2, t2.type()))
    print("t3:{}\nt3.type:{}".format(t3, t3.type()))

    # randint(low=0, high, size, out=None, dtype=None)
    # randint_like(input, low=0, high, dtype=None)
    # 整数范围[low, high)
    t4 = torch.randint(1, 4, (2, 3, 2))  # 形状写成[2,3,2]也行
    t5 = torch.randint_like(t1, 4)
    print('\n')
    print('3_3_3_' * 20)
    print("t4:{}\nt4.type:{}".format(t4, t4.type()))
    print("t5:{}\nt5.type:{}".format(t5, t5.type()))

OUT:

1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_
t1:tensor([[0.7576, 0.2793, 0.4031],
        [0.7347, 0.0293, 0.7999]])
t1.type:torch.FloatTensor


2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_
t2:tensor([[ 0.5636,  1.1431,  0.8590],
        [ 0.7056, -0.3406, -1.2720]])
t2.type:torch.FloatTensor
t3:tensor([[-1.1948,  0.0250, -0.7627],
        [ 1.3969, -0.3245,  0.2879]])
t3.type:torch.FloatTensor


3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_
t4:tensor([[[3, 3],
         [1, 1],
         [2, 1]],

        [[3, 1],
         [3, 3],
         [1, 3]]])
t4.type:torch.LongTensor
t5:tensor([[1., 3., 3.],
        [1., 2., 1.]])
t5.type:torch.FloatTensor

torch.randperm()

在这里插入图片描述

# ===============================  example 9 ===============================
# torch.randperm()
flag = True
# flag = False
if flag:
    # torch中没有random.shuffle
    # y = torch.randperm(n) y是把1到n这些数随机打乱得到的一个数字序列
    import torch

    # randperm(n, out=None, dtype=torch.int64)-> LongTensor
    idx = torch.randperm(3)
    a = torch.Tensor(4, 2)
    print("a: {}".format(a))
    print("\nidx: {}\nidx.type: {}".format(idx, idx.type()))
    print("\na[idx]: {}".format(a[idx]))

OUT:

a: tensor([[-1.9488e-07, -3.3273e+20],
        [-1.9488e-07,  5.3236e+21],
        [-1.9488e-07, -1.6909e+16],
        [-1.9488e-07,  3.1477e+25]])

idx: tensor([1, 2, 0])
idx.type: torch.LongTensor

a[idx]: tensor([[-1.9488e-07,  5.3236e+21],
        [-1.9488e-07, -1.6909e+16],
        [-1.9488e-07, -3.3273e+20]])
### 解决ARJS报表设计器中文本换行的方法 在处理ARJS报表设计器中的文本换行问题时,可以采取多种方法来确保文本能够正确地自动换行并适应容器大小。以下是几种常见且有效的解决方案: #### 方法一:调整CSS样式属性 通过设置合适的 CSS 属性可以让 HTML 元素内的文本自然换行。对于 ARJS 报表设计器而言,在定义报表模板的HTML部分时加入如下样式声明即可达到目的[^1]: ```css <style> .report-content { word-wrap: break-word; white-space: pre-line; overflow-wrap: break-word; } </style> ``` 这些 CSS 属性的作用分别是: - `word-wrap`: 控制单词内断开以防止溢出其容器。 - `white-space`: 处理空白符序列和执行软包装规则;`pre-line`会保留单个换行符并将多个连续空格压缩成一个。 - `overflow-wrap`: 类似于`word-wrap`,用于控制长字符串是否可以在任何字符处被截断。 #### 方法二:利用JavaScript动态计算宽度并插入换行符 如果希望更精确地控制特定区域的文字布局,则可以通过 JavaScript 来测量每一段文字的实际渲染长度,并根据设定的最大宽度决定何时插入`\n`(新行)字符。这种方法适用于那些需要高度自定义排版需求的情况[^2]。 ```javascript function insertLineBreaks(text, maxWidthPx) { const tempDiv = document.createElement('div'); tempDiv.style.position = 'absolute'; tempDiv.style.visibility = 'hidden'; tempDiv.style.whiteSpace = 'nowrap'; // Prevent wrapping inside div document.body.appendChild(tempDiv); let resultText = ''; let currentLine = ''; text.split(/\r?\n/).forEach((line) => { line.split(' ').forEach(word => { tempDiv.textContent = `${currentLine} ${word}`; if (tempDiv.offsetWidth > maxWidthPx && currentLine.length > 0){ resultText += `\n${currentLine.trim()}\n`; currentLine = word; } else { currentLine += ` ${word}`; } }); if(currentLine !== ''){ resultText += `\n${currentLine.trim()}`; currentLine = ''; } resultText += '\n'; }); document.body.removeChild(tempDiv); return resultText.replace(/^\s+/mg,""); // Remove leading spaces from each line. } ``` 此函数接收两个参数——待处理的纯文本以及目标最大宽度(单位像素),返回经过适当分行后的多行字符串形式的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☞源仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值