【问题标题】:Read data from numpy array into a pytorch tensor without creating a new tensor将 numpy 数组中的数据读入 pytorch 张量而不创建新张量
【发布时间】:2021-09-11 22:21:06
【问题描述】:

假设我有一个 numpy 数组 arr = np.array([1, 2, 3]) 和一个 pytorch 张量 tnsr = torch.zeros(3,)

有没有办法将arr中包含的数据读取到已经存在的张量tnsr,而不是像tnsr1 = torch.tensor(arr)这样简单地创建一个新的张量。

这是一个简化的问题示例,因为我使用的数据集包含近 1700 万个条目。

编辑:我知道我可以手动循环遍历数组中的每个条目。有 1700 万个条目,我相信这需要相当长的时间......

【问题讨论】:

  • 目前,我正在使用一种不一定是最有效和/或最优雅的解决方案的解决方法。基本上, tnsr[:] = torch.tensor(arr)[:]
  • 如果有人知道更优雅的解决方案,我会全力以赴 :)

标签: python arrays numpy machine-learning pytorch


【解决方案1】:

您可以使用torch.from_numpy(arr) 做到这一点。这是一个示例,表明它没有被复制。

import numpy as np
import torch

arr = np.random.randint(0,high=10**6,size=(10**4,10**4))
%timeit arr.copy()

告诉我 492 ms ± 6.54 ms 复制了随机整数数组。 另一方面

%timeit torch.from_numpy(arr)

告诉我 1.14 µs ± 131 ns 把它变成张量。所以这 100 个 mio 整数是不可能被复制的。 Pytorch 仍在使用相同的数据。

最后是你的版本,即

%timeit torch.tensor(arr)

给出 201 毫秒 ± 4.08 毫秒。这让我很惊讶。因为它在复制时不应该比 numpy 的副本快。但是当它不复制需要 1/5 或一秒钟的时间时呢?也许它正在做一个浅拷贝。也许其他人可以告诉我们到底发生了什么。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2018-06-30
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多