gpt4 book ai didi

Python:如何在不使用更多 RAM 的情况下将 np 数组/列表拆分为两个数组/列表

转载 作者:行者123 更新时间:2023-12-01 08:05:57 26 4
gpt4 key购买 nike

我在分割 np.数组和列表分为两种。这是我的代码:

X = []
y = []
for seq, target in ConvertedData:
X.append(seq)
y.append(target)

y = np.vstack(y)

train_x = np.array(X)[:int(len(X) * 0.9)]
train_y = y[:int(len(X) * 0.9)]
validation_x = np.array(X)[int(len(X) * 0.9):]
validation_y = y[int(len(X) * 0.9):]

这是为神经网络准备数据的代码示例。效果很好,但会产生“内存不足错误”(我板上有 32GB):

Traceback (most recent call last):
File "D:/Projects/....Here is a file location.../FileName.py", line 120, in <module>
validation_x = np.array(X)[int(len(X) * 0.9):]
MemoryError

看起来它保存在内存列表X和np.array y中,并将其复制为单独的变量train_x,train_y,validation_x,validation_y>。你知道如何处理这个问题吗?

X 的形状:(324000, 256, 24)

y 的形状:(324000,10)

train_x 的形状:(291600, 256, 24)

train_y的形状:(291600,10)

validation_x 的形状:(32400, 256, 24)

validation_y 的形状:(32400,10)

最佳答案

X = []
y = []
for seq, target in ConvertedData:
X.append(seq)
y.append(target)

Xseq 的列表。我假设那些是数组。 X 只是有指向这些的指针,

y = np.vstack(y)

train_x = np.array(X)[:int(len(X) * 0.9)]

X创建一个数组,然后是该数组的一个切片。完整的np.array(X)仍然存在于内存中

train_y = y[:int(len(X) * 0.9)]
validation_x = np.array(X)[int(len(X) * 0.9):]

X创建另一个数组。 train_xvalidation_x 是单独数组的 View 。

validation_y = y[int(len(X) * 0.9):]

正在做

X1 = np.array(X)
train_x = X1[:...]
validation_x = X1[...:]

将消除重复。两者都是同一个 X1 的 View 。

另一种方法是首先对列表进行切片:

train_x = np.array(X[:...])
validation_x = np.array(X[...:])

我的猜测是,内存使用,至少在数组中是相似的。

创建 X1 后的

del X 也可能有所帮助,允许对 X 及其引用的数组进行垃圾收集。

但请注意,一旦您在代码中的某个位置开始遇到内存错误,像这样的技巧可能会推迟它。计算很容易最终生成大小相当的副本或临时缓冲区。

<小时/>

您的分割使用 2 个切片;这会产生 View ,但不会增加原始内存使用量。但如果你进行随机分割,训练和验证部分将是副本,并且一起占用与源一样多的内存。

关于Python:如何在不使用更多 RAM 的情况下将 np 数组/列表拆分为两个数组/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55528911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com