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

我在拆分 np.js 时遇到问题。数组和列表一分为二。这是我的代码:


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)


验证_x的形状:(32400, 256, 24)


验证形状_y:(32400,10)


ibeautiful
浏览 207回答 2
2回答

DIEA

X = []y = []for seq, target in ConvertedData:&nbsp; &nbsp; X.append(seq)&nbsp; &nbsp; y.append(target)X是一个列表seq。我假设这些是数组。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_x和validation_x是单独数组的视图。validation_y = y[int(len(X) * 0.9):]正在做X1 = np.array(X)train_x = X1[:...]validation_x = X1[...:]将消除这种重复。两者观点相同X1。另一种方法是先对列表进行切片:train_x = np.array(X[:...])validation_x = np.array(X[...:])我的猜测是内存使用,至少与在数组中会相似。del X创建之后X1可能也有帮助,允许X对其引用的数组进行垃圾收集。但请注意,一旦您在代码中的某一点开始遇到内存错误,像这样的技巧可能会推迟它。计算很容易最终制作出大小相当的副本或临时缓冲区。您的拆分使用 2 个切片;这会产生不会增加原始内存使用量的视图。但是,如果您进行混洗拆分,则训练和验证部分将是副本,并且一起占用与源一样多的内存。

慕尼黑8549860

如内存错误的回答中所述。您可以像在这个问题中一样将每个训练数据数组腌制到文件中。您可以通过train_test_split进行拆分,这可能是执行拆分的更有效方式。import numpy as npfrom sklearn.model_selection import train_test_splitX, y = np.arange(10).reshape((5, 2)), range(5)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python