3

我编写了一个小脚本,通过知道它们的行和列坐标将值分配给 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
4

2 回答 2

2

我会使用bincount这个,但现在 bincount 只需要 1darrays,所以你需要编写自己的 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)
于 2013-04-18T17:59:09.677 回答
0

你可以直接这样做:

gridarray[(rows,cols)]+=data
gridarray_counts[(rows,cols)]+=1
于 2013-04-18T17:50:41.147 回答