没有for循环的行,列分配

时间:2013-04-18 17:41:52

标签: python numpy

我写了一个小脚本,通过知道它们的行和列坐标为numpy数组赋值:

gridarray = np.zeros([3,3])
gridarray_counts = np.zeros([3,3])

cols = np.random.random_integers(0,2,15)
rows = np.random.random_integers(0,2,15)
data = np.random.random_integers(0,9,15)

for nn in np.arange(len(data)):
    gridarray[rows[nn],cols[nn]] += data[nn]
    gridarray_counts[rows[nn],cols[nn]] += 1

事实上,我知道在同一个网格单元中存储了多少个值以及它们的总和。但是,在长度为100000+的数组上执行此操作会变得非常慢。有没有使用for循环的另一种方式?

这种方法可能类似吗?我知道这还不行。

gridarray[rows,cols] += data
gridarray_counts[rows,cols] += 1

2 个答案:

答案 0 :(得分:2)

我会使用bincount来实现这一点,但是现在bincount只需要1个数组,因此您需要编写自己的ndbincout,例如:

def ndbincount(x, weights=None, shape=None):
    if shape is None:
        shape = x.max(1) + 1

    x = np.ravel_multi_index(x, shape)
    out = np.bincount(x, weights, minlength=np.prod(shape))
    out.shape = shape
    return out

然后你可以这样做:

gridarray = np.zeros([3,3])

cols = np.random.random_integers(0,2,15)
rows = np.random.random_integers(0,2,15)
data = np.random.random_integers(0,9,15)

x = np.vstack([rows, cols])
temp = ndbincount(x, data, gridarray.shape)
gridarray = gridarray + temp
gridarray_counts = ndbincount(x, shape=gridarray.shape)

答案 1 :(得分:0)

您可以直接执行此操作:

gridarray[(rows,cols)]+=data
gridarray_counts[(rows,cols)]+=1