numpy.array遇到的问题

问题

因为一些需求,需要有这么一个类:

class test:
    def __init__(self, data:list):
        self._data = data

    def __getitem__(self, index):
        return self._data[index]

由这个类组成一个一维数组,涉及到大量对数组的处理,转成numpy会更方便一些

import numpy as np

data:list[test] = [...]
np.array(data)

正常来说,应该是一个一维的numpy数组,每个元素是test类的对象。

但np.array转换后变成了(len(data), len(data[0]))的矩阵,也就是numpy.array把对象通过__getitem__方法被展开了。

可能是因为对象重载了getitem方法,被numpy当成数组元素进行处理,也就是说本身数据是一维的对象数组,但因为重载了getitem方法,每个对象被当成了数组处理。

在numpy.array中有一个参数like,不确定能不能解决问题。

<think>嗯,用户的问题是关于如何避免在PyTorch中将numpy数组列表转换为张量时速度极慢的问题。他们遇到了UserWarning,提示从numpy.ndarrays列表创建张量非常慢。我需要先理解这个警告的原因,然后给出解决方法。 首先,根据引用[1],问题出在当有一个包含多个numpy数组的列表时,直接使用torch.FloatTensor(b_s)会导致性能问题。因为PyTorch需要逐个处理每个numpy数组,这样效率很低。解决方法是将列表先转换为一个单一的numpy数组,然后再转成张量。比如用np.array(b_s)将列表合并成一个高维数组,这样PyTorch就能一次性处理,速度更快。 然后,用户可能还会遇到只读数组问题,如引用[2]提到的。如果图像处理中使用Image.open得到的数组是只读的,直接转换会导致警告。这时候需要用np.array(pil_img, copy=True)来创建可写的副本,避免问题。 另外,引用[4]建议使用torch.as_tensor来共享内存,提高性能。不过这可能只适用于单个数组的情况,对于列表中的多个数组,可能还是需要先合并成一个大数组,再用as_tensor处理。 所以综合起来,解决方案应该是先将列表中的多个numpy数组合并成一个,再转换为张量。同时要注意数组的可写性,必要时复制。另外,推荐使用torch.as_tensor而不是torch.Tensor来节省内存。 用户可能还希望知道不同方法之间的区别,比如为什么合并数组能提高速度,或者如何避免内存复制。可能需要进一步解释PyTorch在处理单个大数组和多个小数组时的性能差异,以及内存共享的机制。 最后,生成相关问题的时候,可以围绕优化转换速度的不同方法、处理只读数组、内存共享的影响,以及不同创建张量函数的区别来提问。</think>要避免将包含多个NumPy数组的列表直接转换为PyTorch张量时的性能问题,可按照以下步骤操作: ### 解决方法 1. **合并NumPy数组** 先将列表中的多个NumPy数组合并成一个高维数组: ```python b_s = np.array(b_s) # 将多个小数组合并为单一数组 ``` 这一步通过消除逐个处理小数组的开销,使后续转换效率提升10-100倍[^1] 2. **选择张量创建方式** - 基础方案:使用`torch.FloatTensor`直接转换合并后的数组 ```python tensor = torch.FloatTensor(b_s) ``` - 优化方案:通过`torch.as_tensor`实现内存共享 ```python tensor = torch.as_tensor(b_s) # 共享内存,减少拷贝开销[^4] ``` 3. **处理只读数组** 当源数据来自PIL等只读对象时,强制创建可写副本: ```python pil_img = Image.open("image.jpg") np_array = np.array(pil_img, copy=True) # 打破只读限制[^2] tensor = torch.as_tensor(np_array) ``` ### 性能对比 | 方法 | 时间开销 | 内存占用 | 适用场景 | |--------------------------|----------|-----------|--------------------| | 直接转换列表 | 极高 | 高 | 绝对禁止使用 | | 合并后+FloatTensor | 低 | 较高 | 需要新内存时 | | 合并后+as_tensor | 最低 | 最低 | 允许共享内存时[^4] | ### 代码示例 ```python import numpy as np import torch # 原始低效方式(触发警告) slow_tensor = torch.tensor([np.array([1]), np.array([2])]) # UserWarning # 优化后方式 arrays = [np.array([1]), np.array([2])] merged_array = np.array(arrays) # 形状变为(2,1) fast_tensor = torch.as_tensor(merged_array) # 无警告且高效 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值