对所有列求和,但在numpy数组中除以一列

时间:2015-12-07 19:25:49

标签: python numpy

基本上,除了特定列之外的所有列都必须求和。我提出了两个密切相关的解决方案:

def collapse(arr, i):
    return np.hstack((arr[:,i,None], np.sum(arr[:,[j for j in xrange(arr.shape[1]) if j != i]], axis=1, keepdims=True)))

def collapse_transpose(arr, i):
    return np.vstack((arr[:,i], np.sum(arr[:,[j for j in xrange(arr.shape[1]) if j != i]], axis=1))).T

示例:

In [42]: arr = np.arange(9).reshape(3, 3)

In [43]: arr
Out[43]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [44]: collapse(arr, 0)
Out[44]: 
array([[ 0,  3],
       [ 3,  9],
       [ 6, 15]])

我认为后者会更快,但结果会变慢。无论如何,我不喜欢vstackhstack调用,因为它们在巨大输入上可能会很慢。有没有办法摆脱它们?

1 个答案:

答案 0 :(得分:2)

你只连接2个数组

In [282]: (arr[:,i], np.sum(arr[:,[j for j in xrange(3) if j != i]], 
    axis=1))Out[282]: (array([0, 3, 6]), array([ 3,  9, 15]))

In [283]: (arr[:,i,None], np.sum(arr[:,[j for j in xrange(3) if j != i]], axis=1, keepdims=True))
Out[283]: 
(array([[0],
       [3],
       [6]]), array([[ 3],
       [ 9],
       [15]]))

vstackhstack都使用concatenate。它们只是在不同的轴上工作,并以不同的方式按压输入,以确保它们具有正确的尺寸。

在我看来,版本基本相同。您可以直接拨打concatenate,这可能会减少%或两次。但在这种情况下,连接并不是最大的消费时间。

np.concatenate((arr[:,i,None], 
   np.sum(arr[:,[j for j in xrange(3) if j != i]], axis=1, keepdims=True)), 
   axis=1)

除此之外,还要了解各个部件的时间安排。 arr[:,[j for j in xrange(3) if j != i]],axis=1)尽可能快吗?如何对所有内容求和,并减去ith行?

In [310]: timeit arr.sum(1)-arr[:,i]
10000 loops, best of 3: 22.7 us per loop

In [311]: timeit np.sum(arr[:,[j for j in xrange(3) if j != i]], axis=1)
10000 loops, best of 3: 29.1 us per loop