Python 转换为numpy阵列崩溃RAM

Python 转换为numpy阵列崩溃RAM,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组列表。该列表有200000个元素,每个数组的大小为3504。这在我的公羊身上很管用。 类型(x) 您可以尝试重写将_previous_data作为一个延迟生成最终数组行的数组,然后按照Eli的建议使用: from itertools import chain def take_previous_data(X_train,y): temp_train_data=X_train[1000:] temp_labels=y[1000:] for inde

我有一个numpy数组列表。该列表有200000个元素,每个数组的大小为3504。这在我的公羊身上很管用。 类型(x)


您可以尝试重写
将_previous_data
作为一个延迟生成最终数组行的数组,然后按照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

从我们的聊天对话来看,基本问题似乎是无法将输出数组本身装入内存。在这种情况下,您可以采用第二种解决方案将输出阵列写入磁盘:

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中的默认整数类型)。如果您可以切换到较低的位深度(例如
int32
int16
,甚至可能
int8
),您可以大幅降低内存需求。

为什么不首先将数据作为
numpy.array
读取?我将
numpy.array
添加到列表中,它的效率比附加到<代码> NUPY数组。也许你可以考虑单精度或更小的整数类型Python列表比NUMPY数组的效率要低得多。通过将
x
转换为numpy数组,您正在复制内存,这可能就是它崩溃的原因。有很多方法(比使用list更有效)可以将数据初始化为numpy数组。您从哪里读取附加的numpy数组?我的意思是,问题不在于numpy崩溃,问题在于您的读取数据逻辑需要改进。事实上,在
列表
takas
O(1)
摊销后追加,但您首先不必追加。在指定数据类型和形状时,您可以创建一个惰性生成器并将其交给
numpy.fromiter
。这样您就可以获得阵列,而无需任何中间数据结构。谢谢!但你没有整形,请检查。是的,我做了。通过指定数组的
.shape
属性,可以就地重塑数组的形状。-1意味着根据元素总数推断该维度中数组的大小。我认为
cd_I
是一个序列,因此需要调用
np.fromiter(itertools.chain(*gen),dtype=np.int64)
以使
np.fromiter
工作,因为它只接受1D数据流。我好久没睡了,所以我可能是错的。@EliKorvigo好极了。你看到itertools导入链中的
行了吗?
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
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