Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python/Numpy中一次分配相同的数组索引_Python_Arrays_Numpy_Indices - Fatal编程技术网

在Python/Numpy中一次分配相同的数组索引

在Python/Numpy中一次分配相同的数组索引,python,arrays,numpy,indices,Python,Arrays,Numpy,Indices,我想在Python中找到一种快速方法(不使用for循环)来分配数组的重复索引。 这是使用for循环得到的理想结果: 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

我想在Python中找到一种快速方法(不使用for循环)来分配数组的重复索引。 这是使用for循环得到的理想结果:

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.]]
当我尝试在索引
Px,Py
中将
x
添加到
a
时,我显然没有得到相同的结果(3.3 vs.3.1):


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

是的,可以这样做,但有点棘手:

# 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

首先,我将把这些值分组在一起,这样就有了一个元组列表(Px,Py)。然后对该列表进行排序,计算出现次数,用该数字乘以x,并将其添加到数组中。但不知何故,努比似乎跳过了两个入口……奇怪。呸,用完全相同的答案比我快了4秒。尽管如此,我还是真诚地希望有更好的方法来做到这一点。谢谢!我喜欢您使用np.ravel_multi_index函数获取平面索引,然后使用np.bincount和可选权重参数的方式。
# 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