pytorch——数据操作

一、数据初始化

1.torch.arange()

用来构建一个行向量,参数=元素个数,从0开始的自然数排列,默认float型。一个新定义的张量(tensor)都会存储在主存中,在CPU中计算。
例子:

x = torch.arange(12)

输出:

tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

2.x.shape

获取tensor结构
例子:

x.shape

输出:

torch.Size([12])

3.x.numel()

获取trensor中的元素个数
输出:

12

4.x.reshape()

改变x的形状,但不改变里面的值
例子:

x = x.reshape(3, 4)

输出:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

已知tensor原本结构和长宽任一,另一参数设为-1也可。
例如,x.reshape(3, 4), 可以设为 x.reshape(-1, 4) or x.reshape(3, -1).

5.torch.zeros()、torch.ones()

将tensor初始化为0或1
例子:

torch.zeros(2, 3, 4)
torch.ones((2, 3, 4))

输出:

tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

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

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])

6.torch.randn()

根据正态分布和标准差随机初始化
例子:

torch.randn(3, 4)

输出:

tensor([[ 0.9207, -0.6144,  1.2993,  0.5726],
        [-1.5666, -0.0836,  1.8288,  0.8677],
        [ 0.5672, -1.2084, -1.5252, -1.9457]])

7.torch.tensor()

可利用list给tensor自定义初始化
例子:

torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

输出:

tensor([[2, 1, 4, 3],
        [1, 2, 3, 4],
        [4, 3, 2, 1]])

二、运算

1.加减乘除幂次方

例子:

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # The ** operator is exponentiation
Copy to clipboard

输出:

(tensor([ 3.,  4.,  6., 10.]),
 tensor([-1.,  0.,  2.,  6.]),
 tensor([ 2.,  4.,  8., 16.]),
 tensor([0.5000, 1.0000, 2.0000, 4.0000]),
 tensor([ 1.,  4., 16., 64.]))

一元指数运算:

torch.exp(x)

输出:

tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

2.按照给定的行(axis=0)或列(axis=1),连接tensor

例子:

x = torch.arange(12, dtype=torch.float32).reshape((3,4))
y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((x, y), dim=0), torch.cat((x, y), dim=1)

输出:

(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [ 2.,  1.,  4.,  3.],
         [ 1.,  2.,  3.,  4.],
         [ 4.,  3.,  2.,  1.]]),
 tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))

3.逻辑运算

tensor对应位置进行运算,相等为1不等为0
例子:

x == y

输出:

tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])

4.tensor元素相加
例子:

x.sum()

输出:

tensor(66.)

三、广播

对于相同形状的tensor运算只需对应位置计算,对不同形状的tensor,需扩展行或列使得tensor结构相同再进行计算。
例子:

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b

两个tensor行列都不同

(tensor([[0],
         [1],
         [2]]),
 tensor([[0, 1]]))

做加法:

a + b

输出:

tensor([[0, 1],
        [1, 2],
        [2, 3]])

四、索引和切片

索引从0开始,范围大小包括第一个元素但不包括最后一个。也可以用负索引。
例子:

x[-1], x[1:3]

输出:

(tensor([ 8.,  9., 10., 11.]),
 tensor([[ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]]))

即-1代表输出最后一个,[1:3]代表输出索引为1-3但不包括3。
还可以根据索引更改元素。
例子:

x[1, 2] = 9
x

输出:

tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  9.,  7.],
        [ 8.,  9., 10., 11.]])

改了第2行第3列的元素。
如果要为tensor中多个元素同时更改数值,用切片方式给对应索引换值。
例子:

x[0:2, :] = 12
x

输出:

tensor([[12., 12., 12., 12.],
        [12., 12., 12., 12.],
        [ 8.,  9., 10., 11.]])

给第1行和第2行的每列元素换值。

五、节省内存

在进行运算时,会给计算结果分配新的内存,可以通过Python自带的id函数:如果两个实例的ID一致,那么它们所对应的内存地址相同;反之则不同。

before = id(y)
y = y + x
id(y) == before

输出:

False

如果想指定结果到特定内存,可以使用前面介绍的索引来进行替换操作。
例子:

z = torch.zeros_like(y)
print('id(z):', id(z))
z[:] = x + y
print('id(z):', id(z))

输出:

id(z): 140144689613552
id(z): 140144689613552

实际上,上例中还是为X + Y开了临时内存来存储计算结果,再复制到Z对应的内存。如果想避免这个临时内存开销,可以直接将运算结果放回x。
例子:

before = id(x)
x += y
id(x) == before

输出:

True

六、转换为其他的python对象

例子:

a = x.numpy()
b = torch.tensor(a)
type(a), type(b)

输出:

(numpy.ndarray, torch.Tensor)

将tensor转换为数值,用item()
例子:

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

输出:

(tensor([3.5000]), 3.5, 3.5, 3)

如有不对,请帮忙指正!!!

特别感谢小宋是呢https://blog.csdn.net/xiaosongshine

猜你喜欢

转载自blog.csdn.net/laozaoxiaowanzi/article/details/107323188