基本上,除了特定列之外的所有列都必须求和。我提出了两个密切相关的解决方案:
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]])
我认为后者会更快,但结果会变慢。无论如何,我不喜欢vstack
和hstack
调用,因为它们在巨大输入上可能会很慢。有没有办法摆脱它们?
答案 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]]))
vstack
和hstack
都使用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