我想用它bincount来求和数组,但它只支持双精度数.例如,这有效:
np.bincount([1, 1, 0],weights=np.array([1, 2, 4]))
Out: array([ 4., 3.])
Run Code Online (Sandbox Code Playgroud)
但是我想使用维度2数组:
np.bincount([1, 1, 0],weights=np.array([[1,1], [2,2], [4,4]]))
ValueError: object too deep for desired array
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
Out: array([[ 4., 4.],[3., 3.]])
Run Code Online (Sandbox Code Playgroud)
评论后更好的解释:
我想将数组的每一行加到相应的索引中.
循环它将是:
Bin=np.zeros(2,2)
for i in [1,1,0]:
Bin[i]+=a[i]
Run Code Online (Sandbox Code Playgroud)
a是先前的3x2矩阵是否有一种有效的方法来获得此结果?
根据 numpy 文档:
numpy.bincount(x, weights=None, minlength=None)
Run Code Online (Sandbox Code Playgroud)
权重:类似数组,可选; 权重,与 x 形状相同的数组。
所以你不能bincount直接以这种方式使用,除非你x以某种方式进行改变。
编辑:所以我想出了一个稍微棘手的方法来做到这一点,但不能保证当你使用大型数组时的性能。基本上我将利用 scipy 稀疏矩阵如何处理相同索引处的重复条目(它们对它们求和):
from scipy.sparse import *
a = np.array([[1,1], [2,2], [4,4]])
ii = np.array([1, 1, 0])
ares = a.reshape((-1,),order='F')
# ares == array([1, 2, 4, 1, 2, 4])
col = np.tile(ii,(a.shape[1],))
# col == np.array([1, 1, 0, 1, 1, 0])
row = np.tile([0,1],(a.shape[0],1)).reshape((-1,),order='F')
# row == np.array([0,0,0,1,1,1])
g = coo_matrix((ares,(col,row)),shape=(2,2))
print g.todense()
Run Code Online (Sandbox Code Playgroud)
现在您必须将其概括为您的精确数据。基本思想是,您希望将每个数据点映射到结果数组的正确元素,然后让稀疏数组处理重复条目的求和。
否则,如果您被迫使用循环来解决此问题,我会考虑使用 Cython。
编辑2:对于踢球,我计时了两种不同的方法:
import numpy as np
from scipy.sparse import *
def method1():
return np.array([np.bincount(ii, r) for r in a.T]).T
def method2():
ares = a.reshape((-1,),order='F')
col = np.tile(ii,(a.shape[1],))
row = np.tile(np.arange(a.shape[1]),(a.shape[0],1)).reshape((-1,),order='F')
return coo_matrix((ares,(col,row)),shape=(np.unique(ii).size,a.shape[1])).todense()
if __name__ == '__main__':
from timeit import Timer
a = np.random.randint(0,1000,(1000000,3))
ii = np.random.randint(0,10,(a.shape[0],))
N = 100
t1 = Timer("method1()", "from __main__ import method1")
t2 = Timer("method2()", "from __main__ import method2")
print 't2/t1: %f' % (t2.timeit(N)/t1.timeit(N))
Run Code Online (Sandbox Code Playgroud)
在我的机器上,method2速度大约比method1输入形状慢 3-5 倍,因此循环不一定是一个坏选择。
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |