我希望在置换之后分配我的labels
数组。我正在使用类似于下面的代码。
np.random.seed(42)
labels = np.zeros((10,1),dtype=int)
idx = np.random.permutation(len(labels))
labels[idx][1:5] = np.random.randint(0,10,(4,1))
但是,如下所示,标签仍然为零,并且未分配任何内容。我只能想象标签[idx]部分会创建一个副本,这就是所分配的内容。我该如何规避这个?
labels
>>> array([[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0]])
所需的输出是:
for i,j in enumerate(idx2):
labels[idx[j]] = a[i]
labels
>>> array([[7],
[2],
[0],
[0],
[0],
[6],
[0],
[4],
[0],
[0]])
答案 0 :(得分:1)
In [207]: idx
Out[207]: array([5, 8, 3, 7, 9, 1, 6, 0, 4, 2])
In [208]: x=np.random.randint(0,10,(10,1))
In [209]: x
Out[209]:
array([[5],
[7],
[4],
[4],
[9],
[6],
[2],
[1],
[9],
[9]])
In [210]: labels[idx]=x
In [211]: labels
Out[211]:
array([[1],
[6],
[9],
[4],
[9],
[5],
[2],
[4],
[7],
[9]])
使用idx
之类的索引时,您必须执行
labels[idx] = ...
执行labels[idx][:5] = ....
不起作用,因为labels[idx]
本身会创建副本。
labels[:5][idx[:5]] = ...
应该有效,因为[:5]
会创建一个视图。
更正:
labels[:5][np.random.randint(0,5,5)]=np.arange(5)[:,None]
如果有必要,我建议您查看有关视图与副本以及基本与高级索引的文档。
答案 1 :(得分:0)
你是说这个吗?
labels = np.zeros((10,1),dtype=int)
idx = np.random.permutation(len(labels))
pool = np.random.randint(0,10,(4,1))
for i in range(4):
labels[i] = pool[i]
print labels
答案 2 :(得分:0)
以下代码段回答了我的问题:
idx2 = np.argsort(idx)
labels[1:5] = a
labels[idx2]
关键是要找到从排列回到原始排列的映射。这是np.argsort(idx)
做的。