置换后分配数组

时间:2016-11-24 04:11:51

标签: python arrays numpy indexing

我希望在置换之后分配我的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]])  

3 个答案:

答案 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)做的。