试图通过Numpy Ndarray对象求和时Python中的内存错误

试图通过Numpy Ndarray对象求和时Python中的内存错误,python,numpy,matrix,scipy,multidimensional-array,Python,Numpy,Matrix,Scipy,Multidimensional Array,我有一个巨大的numpy ndarray(称为mat,形状为700000 x 6000),我想通过这些列求和,找到非零索引 我想这样总结一下: x = np.sum(mat[:,y], axis=1) indices = np.nonzero(x) 但是第一行马上给了我一个即时记忆错误。有没有一种方法可以让我使用np.sum,然后用另一种方法来计算呢?你有两个问题: 请参阅Sven Marnach的评论,您的数据集对于您的硬件来说可能太大 参见ajcr的评论,您想做的事情与您尝试的方式不可行

我有一个巨大的numpy ndarray(称为
mat
,形状为700000 x 6000),我想通过这些列求和,找到非零索引

我想这样总结一下:

x =  np.sum(mat[:,y], axis=1)
indices = np.nonzero(x)
但是第一行马上给了我一个即时记忆错误。有没有一种方法可以让我使用np.sum,然后用另一种方法来计算呢?

你有两个问题:

  • 请参阅Sven Marnach的评论,您的数据集对于您的硬件来说可能太大
  • 参见ajcr的评论,您想做的事情与您尝试的方式不可行,因为符号
    mat[:,一个索引]
    返回一个维度1的数组,其唯一的轴是
    axis=0
  • 另一个问题是数组的性质,如果它是一个浮点数数组,700000个条目的和正好等于零的概率接近于零。。。当然,这不是不可能的,但肯定不可能

    也就是说,如果您可以减少数据集或改进硬件,您可以这样做

    In [39]: a = np.zeros((10,5))
    
    In [40]: for i in range(5): a[3,i]=1+2*i if i != 3 else 0.0
    
    In [41]: a
    Out[41]: 
    array([[ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 1.,  3.,  5.,  0.,  9.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])
    
    In [42]: np.sum(a,axis=0)
    Out[42]: array([ 1.,  3.,  5.,  0.,  9.])
    
    In [43]: np.nonzero(np.sum(a,axis=0))
    Out[43]: (array([0, 1, 2, 4]),)
    
    In [44]: 
    

    假设
    y
    是一个整数
    np.sum(mat[:,y],axis=1)
    生成一个
    ValueError
    ,因为
    mat[:,y]
    具有形状
    (7000000,)
    。您是否正在执行
    mat[:,:y]
    操作(切片到
    y
    th列)?假设您的矩阵包含标准浮点数,则纯矩阵数据将占用几乎32 GB的内存。根据您所使用的硬件,仅在内存中对这种大小的数据集执行操作可能不是一个好主意。