我有一个非常简单的问题,我无法从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.roll
与np.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])