gpt4 book ai didi

python - 转换为 numpy 数组会导致 RAM 崩溃

转载 作者:行者123 更新时间:2023-12-01 04:32:14 26 4
gpt4 key购买 nike

我有一个 numpy 数组列表。该列表有 200000 个元素,每个数组的大小为 3504。这在我的 RAM 中运行良好。类型(x)

(Pdb) type(x)
<type 'list'>
(Pdb) len(x)
200001
(Pdb) type(x[1])
<type 'numpy.ndarray'>
(Pdb) x[1].shape
(3504L,)

问题是,现在我将列表转换为 numpy 数组,它超出了 RAM 100% 使用率,导致我的电脑卡住/崩溃。我的转换意图是执行一些特征缩放和 PCA。

编辑:我想将每个样本转换为前 1000 个样本及其自身的串联数组。

def take_previous_data(X_train,y):
temp_train_data=X_train[1000:]
temp_labels=y[1000:]
final_train_set=[]
for index,row in enumerate(temp_train_data):
actual_index=index+1000
data=X_train[actual_index-1000:actual_index+1].ravel()
__,cd_i=pywt.dwt(data,'haar')
final_train_set.append(cd_i)
return final_train_set,y


x,y=take_previous_data(X_train,y)

最佳答案

您可以尝试将 take_previous_data 重写为 generator function延迟生成最终数组的行,然后使用 np.fromiter ,正如 Eli 建议的那样:

from itertools import chain

def take_previous_data(X_train,y):
temp_train_data=X_train[1000:]
temp_labels=y[1000:]
for index,row in enumerate(temp_train_data):
actual_index=index+1000
data=X_train[actual_index-1000:actual_index+1].ravel()
__,cd_i=pywt.dwt(data,'haar')
yield cd_i

gen = take_previous_data(X_train, y)

# I'm assuming that by "int" you meant "int64"
x = np.fromiter(chain.from_iterable(gen), np.int64)

# fromiter gives a 1D output, so we reshape it into a (200001, 3504) array
x.shape = 200001, -1

另一种选择是预先分配输出数组并在进行过程中填充行:

def take_previous_data(X_train, y):
temp_train_data=X_train[1000:]
temp_labels=y[1000:]
out = np.empty((200001, 3504), np.int64)
for index,row in enumerate(temp_train_data):
actual_index=index+1000
data=X_train[actual_index-1000:actual_index+1].ravel()
__,cd_i=pywt.dwt(data,'haar')
out[index] = cd_i
return out
<小时/>

从我们的聊天对话来看,根本问题似乎是您实际上无法将输出数组本身放入内存中。在这种情况下,您可以调整第二个解决方案以使用 np.memmap将输出数组写入磁盘:

def take_previous_data(X_train, y):
temp_train_data=X_train[1000:]
temp_labels=y[1000:]
out = np.memmap('my_array.mmap', 'w+', shape=(200001, 3504), dtype=np.int64)
for index,row in enumerate(temp_train_data):
actual_index=index+1000
data=X_train[actual_index-1000:actual_index+1].ravel()
__,cd_i=pywt.dwt(data,'haar')
out[index] = cd_i
return out

另一个明显的解决方案是减少数组的位深度。我假设 int 指的是 int64 (numpy 中的默认整数类型)。如果您可以切换到较低的位深度(例如 int32int16 甚至 int8),您可以大大减少内存需求。

关于python - 转换为 numpy 数组会导致 RAM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211350/

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