由torch.tensor或者cupy.array组成的list变成list

由tensor组成的list

深度学习的OA可能通过循环形成list,但是作图不能用在GPU上的数据。

import matplotlib.pyplot as plt
import numpy as np
import torch


train_binary_OA_list=[torch.tensor(2).cuda(0),torch.tensor(2).cuda(0)]
# 将每个张量从GPU移动到CPU,并转换为Python的int类型
train_binary_OA_list = [t.cpu().item() for t in train_binary_OA_list]
xpoints1 = np.arange(len(train_binary_OA_list)) +1
ypoints1 = np.array(train_binary_OA_list)
plt.plot(xpoints1, ypoints1)
plt.show()

train_binary_OA_list是由tensor组成的list,如下图:

由于tensor部署在GPU上(.cuda(0))所以在后面画图plt.plot(xpoints1, ypoints1)会报错:

TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

在我的Python3.10解释器中有种解决方案:(1)将cuda(0)删除;(2)将tensor变成list或者ndarray型。本质上都是将GPU上的数据放到CPU上。

list = [t.cpu().item() for t in list_make_of_tensor]

通过上面的代码,我将tensor转换成list如下。就可以成功绘图了。

最终的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import torch


train_binary_OA_list=[torch.tensor(2).cuda(0),torch.tensor(2).cuda(0)]
# 将每个张量从GPU移动到CPU,并转换为Python的int类型
train_binary_OA_list = [t.cpu().item() for t in train_binary_OA_list]
xpoints1 = np.arange(len(train_binary_OA_list)) +1
ypoints1 = np.array(train_binary_OA_list)
plt.plot(xpoints1, ypoints1)
plt.show()

由array组成的list

import cupy as cp

list_make_of_array = [cp.array(1), cp.array(4)]
list = [arr.item() for arr in list_make_of_array]

输出

[1, 4]

总结

list = [t.cpu().item() for t in list_make_of_tensor]

list = [arr.item() for arr in list_make_of_array]

推广

如上图所示,一般来说,由tensor或者array组成的list的形成,是由于开始的时候申请了list并用于后续的存储数据。

在后续的数据类型的变换虽然也是可行的,但是我们最好在开始的时候就申请符合要求的数值类型(也就是尽量让上图类似的数据不要出现):tensor和array都可以用来存储数组。

import cupy as cp

x = cp.array([])

list_make_of_array = [cp.array(1), cp.array(4)]

for i in list_make_of_array:
    x = cp.append(x, i)

如上代码,我们直接申请array型存储数值。在后面数据类型就是<class 'cupy.ndarray'>。

tensor array与numpy的不同之处

函数不同:前两者更偏向类的方法调用

import torch
import cupy as cp
import numpy as np


x = torch.tensor([1,4])
x = x.max()
print(x)

y = cp.array([1,4])
y = y.max()
print(y)

z = np.array([1,4])
z = max(z)
print(z)

访问元素的方式不同:前两者还有另一种访问方法

list = [[1, 2], [3, 4]]
print(list[0][0])

import numpy as np

array = np.array(list)
print(array[0][0])

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值