在Python / numpy的分配相同的数组索引一次 [英] Assigning identical array indices at once in Python/Numpy

查看:148
本文介绍了在Python / numpy的分配相同的数组索引一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找到一个快速的方式(无环路)在Python分配reoccuring数组的索引。
这是使用所需的结果for循环:

I want to find a fast way (without for loop) in Python to assign reoccuring indices of an array. This is the desired result using a for loop:

import numpy as np
a=np.arange(9, dtype=np.float64).reshape((3,3))
# The array indices: [2,3,4] are identical.
Px = np.uint64(np.array([0,1,1,1,2]))
Py = np.uint64(np.array([0,0,0,0,0]))
# The array to be added at the array indices (may also contain random numbers).
x = np.array([.1,.1,.1,.1,.1])

for m in np.arange(len(x)):
    a[Px[m]][Py[m]] += x

print a
%[[ 0.1  1.  2.]
%[ 3.3  4.  5.]
%[ 6.1  7.  8.]]

当我尝试添加 X A 在指数 Px活性,芘我显然没有得到同样的结果(3.3对3.1):

When I try to add x to a at the indices Px,Py I obviously do not get the same result (3.3 vs. 3.1):

a[Px,Py] += x
print a
%[[ 0.1  1.  2.]
%[ 3.1  4.  5.]
%[ 6.1  7.  8.]]

有没有办法用numpy的做到这一点?谢谢你。

Is there a way to do this with numpy? Thanks.

推荐答案

是的,这是可以做到的,但它是一个有点棘手:

Yes, it can be done, but it is a little tricky:

# convert yourmulti-dim indices to flat indices
flat_idx = np.ravel_multi_index((Px, Py), dims=a.shape)
# extract the unique indices and their position
unique_idx, idx_idx = np.unique(flat_idx, return_inverse=True)
# Aggregate the repeated indices 
deltas = np.bincount(idx_idx, weights=x)
# Sum them to your array
a.flat[unique_idx] += deltas

这篇关于在Python / numpy的分配相同的数组索引一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆