关于numpy和torch.tensor的张量的操作

目录
  • 1. 张量的拼接
    • (1) numpy.concatenate
    • (2) torch.cat
  • 2. 张量的重构
    • (1) np.reshape
    • (2) array.shape
    • (3) torch.view
  • 3. 张量的形状
    • (1) torch.size
  • 4. 张量的扩展
    • (1) torch.tensor扩展方法
    • (2) np.array扩展方法
  • 总结

1. 张量的拼接

(1) numpy.concatenate

np.concatenate((a1,a2,a3,…), axis=0)

张量的拼接要用np.concatenate这个方法的,其中 a1,a2,a3,…是拼接的子张量,axis是维数,axis=0表示按照第一维进行拼接。

例如将两个二维的张量按照第一维拼接成一个二维的张量:

import numpy as np
a=np.array([[1,2,3]])
b=np.array([[4,5,6]])
c=np.concatenate((a,b),axis=0)
print(c)
d=np.concatenate((c,a),axis=0)
print(d)
e=np.concatenate((c,c),axis=1)
print(e)

结果

array([[1, 2, 3],
       [4, 5, 6]])
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3]])
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])

对于axis选择的更简单直接的理解是我们可以从将被拼接的两个矩阵的形状上来看,比如

a.shape=(3,1,2), b.shape=(6,1,2),则我们对其进行拼接的话目的是让拼接之后的shape=(9,1,2),那么我们就选择axis=0,即代表对第0维的进行相加。

代码如下:

import numpy as np
a = np.zeros((3, 1, 2))
b = np.zeros((6, 1, 2))
c = np.concatenate((a, b), axis=0)
print(c.shape)

结果为:

(9, 1, 2)

(2) torch.cat

这里的拼接和上面介绍的numpy的拼接功能是一样的

C = torch.cat( (A,B),0 )  #按维数0拼接(竖着拼)
C = torch.cat( (A,B),1 )  #按维数1拼接(横着拼)

例:

import torch
A=torch.ones(2,3)  #2x3的张量(矩阵)   
B=2*torch.ones(4,3)  #4x3的张量(矩阵)    
C=torch.cat((A,B),0)  #按维数0(行)拼接
print(C)                      

结果:

tensor([[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]])

接着上面

D=2*torch.ones(2,4) #2x4的张量(矩阵)
C=torch.cat((A,D),1)#按维数1(列)拼接
print(C)

结果:

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

2. 张量的重构

(1) np.reshape

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b = np.reshape(a, (2,3,1))
>>> b
array([[[1],
        [2],
        [3]],

       [[4],
        [5],
        [6]]])
>>> b.shape
(2, 3, 1)

(2) array.shape

>>> import numpy as np
>>> a = np.array([1,2,3,4,5,6,7,8])
>>> a.shape = (2, 4)
>>> a
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

(3) torch.view

在pytorch中view函数的作用为重构张量的维度,相当于numpy中resize()的功能,但是用法可能不太一样。

1.torch.view(参数a,参数b,…)

例如:

import torch
tt1=torch.tensor([-0.3623, -0.6115,  0.7283,  0.4699,  2.3261,  0.1599])
result=tt1.view(3,2)
print(result)

结果

tensor([[-0.3623, -0.6115],
        [ 0.7283,  0.4699],
        [ 2.3261,  0.1599]])

在上面例子中参数a=3和参数b=2决定了将一维的tt1重构成3x2维的张量。

2.有的时候会出现torch.view(-1)或者torch.view(参数a,-1)这种情况。

例:

import torch
tt2=torch.tensor([[-0.3623, -0.6115],
         [ 0.7283,  0.4699],
         [ 2.3261,  0.1599]])
result=tt2.view(-1)
print(result)

结果:

tensor([-0.3623, -0.6115,  0.7283,  0.4699,  2.3261,  0.1599])

由上面的案例可以看到,如果是torch.view(-1),则原张量会变成一维的结构。

例:

import torch
tt3=torch.tensor([[-0.3623, -0.6115],
         [ 0.7283,  0.4699],
         [ 2.3261,  0.1599]])
>>> result=tt3.view(2,-1)

结果:

tensor([[-0.3623, -0.6115,  0.7283],
        [ 0.4699,  2.3261,  0.1599]])

由上面的案例可以看到,如果是torch.view(参数a,-1),则表示在参数b未知,参数a已知的情况下自动补齐列向量长度,在这个例子中a=2,tt3总共由6个元素,则b=6/2=3。

例:

import torch
inputs = torch.randn(1,3)
print(inputs)
print(inputs.view(1, 1, -1))

结果:

tensor([[-0.5525,  0.6355, -0.3968]])
tensor([[[-0.5525,  0.6355, -0.3968]]])

将二维变为三维,a=1,b=1,c=3/(1*1)

3. 张量的形状

(1) torch.size

import torch
inputs = torch.randn(1,3)
print(inputs.size())

结果:

torch.Size([1, 3])

4. 张量的扩展

(1) torch.tensor扩展方法

用unsqueeze方法将原张量进行维度扩张,unsqueeze后面括号里的数字代表在哪个维度扩张

import torch

a = torch.tensor([[1, 2, 3], [4, 5, 6]])
b = torch.tensor([[7, 8, 9], [4, 5, 6]])
print(a)
print(b)
a = a.unsqueeze(0)
b = b.unsqueeze(0)
print(a)
print(b)
c = torch.cat((a, b), 0)
print(c)
print(c.shape)

结果为

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

[[7, 8, 9],
         [4, 5, 6]]])
torch.Size([2, 2, 3])

用squeeze方法将原张量进行维度缩减,squeeze后面括号里的数字代表在哪个维度缩减

import torch

a = torch.tensor([[1, 2, 3], [4, 5, 6]])
b = torch.tensor([[7, 8, 9], [4, 5, 6]])
print(a)
print(b)
a = a.unsqueeze(0)
b = b.unsqueeze(0)
print(a)
print(b)
a = a.squeeze(0)
b = b.squeeze(0)
print(a)
print(b)

结果为

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

(2) np.array扩展方法

np.expand_dims:用于扩展数组的形状

原始数组:

import numpy as np
 
In [12]:
a = np.array([[[1,2,3],[4,5,6]]])
a.shape
Out[12]:
(1, 2, 3)

np.expand_dims(a, axis=0)表示在0位置添加数据,转换结果如下:

In [13]:
b = np.expand_dims(a, axis=0)
b
Out[13]:
array([[[[1, 2, 3],
         [4, 5, 6]]]])
 
In [14]:
b.shape
Out[14]:
(1, 1, 2, 3)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Pytorch实现张量的创建与使用方法

    目录 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 2.张量的类型 3.张量类型的转化 张量的维度及形变 1.创建高维张量 2.张量的形变 2.1 flatten拉平: 将任意维度张量转化为一维张量 2.2 reshape方法: 任意变形 特殊张量的创建方法 1.特殊取值的张量的创建方法 2.创建指定形状的数组 张量和其他类型的转化方法 张量的深拷贝 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 张量最基本的创建方法和Numpy中创建Array的格式一样,都是创建

  • Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式

    我就废话不多说了,大家还是直接看代码吧! #!/usr/bin/python # -*- coding: UTF-8 -*- from PIL import Image import numpy as np import torch pil_img = Image.open('/Users/songlu/Desktop/code.jpg') img = np.array(pil_img) print torch.from_numpy(img) 补充知识:pytorch mxnet 多GPU训练

  • Numpy与Pytorch 矩阵操作方式

    Numpy 随机矩阵: np.random.randn(d0, d1, d2, ...) 矩阵大小与形状: np.ndarray.size 与 np.dnarray.shape Pytorch 随机矩阵: torch.randn(d0, d1, d2, ...) 添加维度: tensor.unsqueeze(0) 压缩维度: tensor.squeeze(0) 按维度拼接tensor: torch.cat(inputs, dim=0, ...) 维度堆叠: torch.stack(inputs,

  • 关于numpy和torch.tensor的张量的操作

    目录 1. 张量的拼接 (1) numpy.concatenate (2) torch.cat 2. 张量的重构 (1) np.reshape (2) array.shape (3) torch.view 3. 张量的形状 (1) torch.size 4. 张量的扩展 (1) torch.tensor扩展方法 (2) np.array扩展方法 总结 1. 张量的拼接 (1) numpy.concatenate np.concatenate((a1,a2,a3,-), axis=0) 张量的拼接

  • PyTorch中torch.tensor与torch.Tensor的区别详解

    PyTorch最近几年可谓大火.相比于TensorFlow,PyTorch对于Python初学者更为友好,更易上手. 众所周知,numpy作为Python中数据分析的专业第三方库,比Python自带的Math库速度更快.同样的,在PyTorch中,有一个类似于numpy的库,称为Tensor.Tensor自称为神经网络界的numpy. 一.numpy和Tensor二者对比 对比项 numpy Tensor 相同点 可以定义多维数组,进行切片.改变维度.数学运算等 可以定义多维数组,进行切片.改变

  • Pyorch之numpy与torch之间相互转换方式

    numpy中的ndarray转化成pytorch中的tensor : torch.from_numpy() pytorch中的tensor转化成numpy中的ndarray : numpy() 代码 import numpy as np import torch np_arr = np.array([1,2,3,4]) tor_arr=torch.from_numpy(np_arr) tor2numpy=tor_arr.numpy() print('\nnumpy\n',np_arr,'\nto

  • 解决numpy和torch数据类型转化的问题

    在实际计算过程中,float类型使用最多,因此这里重点介绍numpy和torch数据float类型转化遇到的问题,其他类型同理. numpy数据类型转化 numpy使用astype转化数据类型,float默认转化为64位,可以使用np.float32指定为32位 #numpy转化float类型 a= np.array([1,2,3]) a = a.astype(np.float) print(a) print(a.dtype) [1. 2. 3.] float64 不要使用a.dtype指定数据

  • pytorch查看torch.Tensor和model是否在CUDA上的实例

    今天训练faster R-CNN时,发现之前跑的很好的程序(是指在运行程序过程中,显卡利用率能够一直维持在70%以上),今天看的时候,显卡利用率很低,所以在想是不是我的训练数据torch.Tensor或者模型model没有加载到GPU上训练,于是查找如何查看tensor和model所在设备的命令. import torch import torchvision.models as models model=models.vgg11(pretrained=False) print(next(mod

  • 详解torch.Tensor的4种乘法

    torch.Tensor有4种常见的乘法:*, torch.mul, torch.mm, torch.matmul. 本文抛砖引玉,简单叙述一下这4种乘法的区别,具体使用还是要参照官方文档. 点乘 a与b做*乘法,原则是如果a与b的size不同,则以某种方式将a或b进行复制,使得复制后的a和b的size相同,然后再将a和b做element-wise的乘法. 下面以*标量和*一维向量为例展示上述过程. * 标量 Tensor与标量k做*乘法的结果是Tensor的每个元素乘以k(相当于把k复制成与l

  • Python基于Tensor FLow的图像处理操作详解

    本文实例讲述了Python基于Tensor FLow的图像处理操作.分享给大家供大家参考,具体如下: 在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数据进行处理使其变成一张新的图片,在此基础上进行学习,从而提高网络识别的准确率. 1.图像解码显示 利用matplot库可以方便简洁地在jupyter内对图片进行绘制与输出,首先通过tf.gfile打开图片文件,并利用函数tf.image.decode_jpeg将jpeg图片解码为三位矩阵,之后便可以

  • pytorch教程之Tensor的值及操作使用学习

    目录 1.Tensors 建立5*3的矩阵,未初始化 建立随机初始化矩阵 建立零初始化矩阵,数据类型是Long 建立一个tensor数据来源于data 获取tensor的size 2.对Tensor的操作 实现加法的四种方式 所有原地替换 使用标准的numpy操作 使用torch.view 改变tensor的形状 tensor转化为numpy的数字,使用item Torch Tensor 和numpy的相互转换 将numpy array转化为pytorch Tensor CUDA Tensors

  • 详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)

    Numpy中提供了concatenate,append, stack类(包括hsatck.vstack.dstack.row_stack.column_stack),r_和c_等类和函数用于数组拼接的操作. 各种函数的特点和区别如下标: concatenate 提供了axis参数,用于指定拼接方向 append 默认先ravel再拼接成一维数组,也可指定axis stack 提供了axis参数,用于生成新的维度 hstack 水平拼接,沿着行的方向,对列进行拼接 vstack 垂直拼接,沿着列的

  • 详解PyTorch中Tensor的高阶操作

    条件选取:torch.where(condition, x, y) → Tensor 返回从 x 或 y 中选择元素的张量,取决于 condition 操作定义: 举个例子: >>> import torch >>> c = randn(2, 3) >>> c tensor([[ 0.0309, -1.5993, 0.1986], [-0.0699, -2.7813, -1.1828]]) >>> a = torch.ones(2,

随机推荐