Python: 如何在不使用更多 RAM 的情况下将 np 数组/列表拆分为两个数组/列表
Python: How to split np array / list into two arrays / lists without using more RAM
我在拆分 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):]
这是为神经网络准备数据的代码示例。效果很好,但会生成 "out of memory error"(我有 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)
如answer of memory errors. You can pickle each array of trainig data to file like in this question.
所述
您可以按 train_test_split 拆分,这可能是更有效的拆分方式。
import numpy as np
from sklearn.model_selection import train_test_split
X, 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)
X = []
y = []
for seq, target in ConvertedData:
X.append(seq)
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 个切片;这导致视图不会增加原始内存使用。但是如果你进行随机拆分,训练和验证部分将是副本,并且一起占用与源一样多的内存。
我在拆分 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):]
这是为神经网络准备数据的代码示例。效果很好,但会生成 "out of memory error"(我有 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)
如answer of memory errors. You can pickle each array of trainig data to file like in this question.
所述您可以按 train_test_split 拆分,这可能是更有效的拆分方式。
import numpy as np
from sklearn.model_selection import train_test_split
X, 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)
X = []
y = []
for seq, target in ConvertedData:
X.append(seq)
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 个切片;这导致视图不会增加原始内存使用。但是如果你进行随机拆分,训练和验证部分将是副本,并且一起占用与源一样多的内存。