首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试在我的代码中解决numpy.core._exceptions._ArrayMemoryError问题

尝试在我的代码中解决numpy.core._exceptions._ArrayMemoryError问题
EN

Stack Overflow用户
提问于 2022-05-02 04:50:33
回答 1查看 1.2K关注 0票数 1

我有一个数据框架->数据与形状(10000,257)。我需要对此数据进行预处理,以便能够在LSTM中使用它,LSTM需要一个三维输入-(nrow、which步骤、ntimesteps ),我正在使用这里提供的代码片段:

代码语言:javascript
运行
复制
def univariate_processing(variable, window):
   import numpy as np

   # create empty 2D matrix from variable
   V = np.empty((len(variable)-window+1, window))

   # take each row/time window
   for i in range(V.shape[0]):
      V[i,:] = variable[i : i+window]

   V = V.astype(np.float32) # set common data type
   return V

def RNN_regprep(df, y, len_input, len_pred): #, test_size):
    # create 3D matrix for multivariate input
    X = np.empty((df.shape[0]-len_input+1, len_input, df.shape[1]))

    # Iterate univariate preprocessing on all variables - store them in XM
    for i in range(df.shape[1]):
        X[ : , : , i ] = univariate_processing(df[:,i], len_input)

    # create 2D matrix of y sequences
    y = y.reshape((-1,))  # reshape to 1D if needed
    Y = univariate_processing(y, len_pred)

    ## Trim dataframes as explained
    X = X[ :-(len_pred + 1) , : , : ]
    Y = Y[len_input:-1 , :]

    # Set common datatype
    X = X.astype(np.float32)
    Y = Y.astype(np.float32)

    return X, Y

X,y = RNN_regprep(data,label, len_ipnut=200,len_pred=1)

在运行此操作时,将获得以下错误:

代码语言:javascript
运行
复制
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 28.9 GiB for an array with shape (10000, 200, 257) and data type float64

我确实明白,这更多的是我在服务器内存中的问题。我想知道我可以在代码中修改的任何解决方案,看看是否可以避免这个内存错误或尝试减少这个内存消耗?

EN

Stack Overflow用户

发布于 2022-05-02 06:05:56

这就是窗口视图的用途。使用我的食谱here

代码语言:javascript
运行
复制
var = np.random.rand(10000,257)
w = window_nd(var, 200, axis = 0)

现在您在var上有了一个窗口视图

代码语言:javascript
运行
复制
w.shape
Out[]: (9801, 200, 257)

但是,重要的是,它使用了与var完全相同的数据,只是以窗口的方式查看它:

代码语言:javascript
运行
复制
w.__array_interface__['data'] #This is the memory's starting address
Out[]: (1448954720320, False)

var.__array_interface__['data']
Out[]: (1448954720320, False)

np.shares_memory(var, w)
Out[]: True

w.base.base.base is var  #(lots of rearranging views in the background)
Out[]: True

所以你可以:

代码语言:javascript
运行
复制
def univariate_processing(variable, window):
   return window_nd(variable, window, axis = 0)

这将大大减少内存分配,不需要“魔术”:)

你也可以试试

代码语言:javascript
运行
复制
from skimage.util import view_as_windows
w = np.squeeze(view_as_windows(var, (200, 1)))

它做的事情几乎一样。在这种情况下,你的回答是:

代码语言:javascript
运行
复制
def univariate_processing(variable, window):
   from skimage.util import view_as_windows
   window = (window,) + (1,)*(len(variable.shape)-1)
   return np.squeeze(view_as_windows(variable, window))
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72082440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档