【问题标题】:Memory Error in Python when trying to sum through Numpy Ndarray Object尝试通过 Numpy Ndarray 对象求和时 Python 中的内存错误
【发布时间】:2015-03-10 05:30:24
【问题描述】:

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

我想这样总结:

x =  np.sum(mat[:,y], axis=1)
indices = np.nonzero(x)

但是第一行立即给了我一个即时的内存错误。有没有一种方法可以让我使用 np.sum 并以另一种方式进行计算?

【问题讨论】:

  • 假设y 是一个整数np.sum(mat[:,y], axis=1) 产生一个ValueError,因为mat[:,y] 的形状为(7000000,)。你是在做mat[:, :y] 吗(切到yth 列)?
  • 假设您的矩阵包含标准浮点数,那么纯矩阵数据将占用将近 32 GB 的内存。根据您所使用的硬件,完全在内存中对这种大小的数据集进行操作可能不是一个好主意。

标签: python numpy matrix scipy multidimensional-array


【解决方案1】:

你有两个问题:

  1. 请参阅 Sven Marnach 的评论,您的数据集可能对您的硬件来说太大了
  2. 请参阅 ajcr 的评论,您想要做的事情并不像您尝试做的那样可行,因为符号 mat[:,an_index] 会返回一个维度数组,其 only 轴是 @987654322 @

另一个问题是您的数组的性质,如果它是一个浮点数数组,则 700,000 个条目的总和恰好等于零的概率接近于零......不是当然不可能,但肯定不可能。

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

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]: 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2023-03-29
    相关资源
    最近更新 更多