如何从列索引矩阵设置矩阵的单元格

时间:2017-10-06 22:38:46

标签: numpy

我想从位置列表和内核中心列表构建内核。内核应该是每个位置最接近两个中心的指标。

> x = np.array([0.1, .49, 1.9, ]).reshape((3,1))  # Positions
> c = np.array([-2., 0.1,  0.2,  0.4,  0.5,  2.]) # centers
print x
print c

[[ 0.1 ]
 [ 0.49]
 [ 1.9 ]]
[-2.   0.1  0.2  0.4  0.5  2. ]

我想要离开的是:

array([[ 0, 1, 1, 0, 0, 0],  # Index 1,2 closest to 0.1
       [ 0, 0, 0, 1, 1, 0],  # Index 3,4 closest to 0.49
       [ 0, 0, 0, 0, 1, 1]])  # Index 4,5 closest to  1.9

我可以得到:

> dist = np.abs(x-c)
array([[ 2.1 ,  0.  ,  0.1 ,  0.3 ,  0.4 ,  1.9 ],
       [ 2.49,  0.39,  0.29,  0.09,  0.01,  1.51],
       [ 3.9 ,  1.8 ,  1.7 ,  1.5 ,  1.4 ,  0.1 ]])

> np.argsort(dist, axis=1)[:,:2]
array([[1, 2],
       [4, 3],
       [5, 4]])

这里我有一个列索引矩阵,但是我不知道如何使用它们来设置另一个矩阵中这些列的值(使用高效的numpy操作)。

idx = np.argsort(dist, axis=1)[:,:2]
z = np.zeros(dist.shape)
z[idx]=1 # NOPE
z[idx,:]=1 # NOPE
z[:,idx]=1 # NOPE

1 个答案:

答案 0 :(得分:1)

一种方法是初始化零数组,然后使用advanced-indexing -

进行索引
fatalError

或者,我们可以使用维度扩展来使用broadcasting并提出一个单行 -

  plotOptions: {
    series: {
      dataLabels: {
        formatter: function() {
          return "<table><tr><td>HEADER LEFT</td><td class='right'>Header Right</td></tr><tr><td>" + this.x + "</td><td class='right'>" + this.y + "</td></tr>";
        },
        enabled: true,
        useHTML: true,
      }
    }
  },

为了表现,我建议使用np.argpartition来获取这些指数 -

out = np.zeros(dist.shape,dtype=int)
out[np.arange(idx.shape[0])[:,None],idx] = 1