通过循环迭代numpy数组的元素



我有一个非常简单的问题,我无法从numpy参考文档中快速解决。

假设我有一个numpy数组labels = np.array([1, 2, 3])
我有另一个数组arr = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
我想随机抽样arr的索引。假设我们的指数是[0, 3, 6]

现在,我想让这些索引对应的元素在labels中循环1。所以,既然arr[0] == 1,我们就设置arr[0] = 2。由于arr[3] == 2,我们将设置arr[3] = 3。自arr[6] == 3起,我们将设置arr[6] = 1

所以,重述一下:

arr = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
labels = np.unique(arr)
idx = np.array([0, 3, 6])  # randomly generate indices [0, 3, 6]
new_arr == np.array(2, 1, 1, 3, 2, 2, 1, 3, 3])  # this is the array I want

这看起来很简单,但我找不到一种优雅的方法来快速完成!

如果我理解对了,您可以将np.rollnp.random.randint合并,即:

sample_idx = np.roll(np.random.randint(len(arr), 3), shift=1)                                                                                                                                                                                            
sample = [labels[i] for i in sample_idx]

即随机抽取3个索引,每滚动1个。这应该是要重新映射到标签的最终索引。

编辑

。您可以分两步完成:

new_arr = arr.copy()
new_arr[idx] = np.roll(labels, -1)  # fixed the shift to -1

输出:

array([2, 1, 1, 3, 2, 2, 1, 3, 3])

最新更新