【问题标题】:use `numpy.take` to randomly select 2d points使用 `numpy.take` 随机选择 2d 点
【发布时间】:2020-08-11 20:37:16
【问题描述】:

问题设置:

  • points - 长度为 N 的二维 numpy.array。
  • centroids - 2D numpy.array 作为K-Means 算法的输出,长度为k N。
  • 作为MLE 算法的质心初始化例程,我想为points 中的每个点分配来自centroids 的随机质心。

所需输出:

  • 一个形状为 (N, 2) 的numpy.array ,由centroids 中随机选择的二维点组成

我的努力:

  1. 我已尝试将numpy.take 与numpy.random.choice 一起使用,如Code 1 所示,但它没有返回所需的输出。

代码 1:

import numpy as np

a = np.random.randint(1, 10, 10).reshape((5, 2))
idx = np.random.choice(5, 20)
np.take(a, idx)
Out: array([6, 2, 3, 3, 8, 2, 5, 2, 6, 3, 3, 8, 6, 6, 6, 6, 8, 2, 6, 5])

从numpy.take documentation page 我了解到它从扁平数组中选择项目,这不是我需要的。

如果有任何关于如何完成这项任务的想法,我将不胜感激。提前感谢您的帮助。

【问题讨论】:

    标签: python python-3.x numpy numpy-ndarray


    【解决方案1】:

    一种方法是对索引进行采样,然后使用它来索引centroids 的第一个维度:

    idx = np.random.choice(np.arange(len(centroids)), size=len(a))
    
    out = centroids[idx]
    

    【讨论】:

      【解决方案2】:

      类似于@Quang Hoang 的回答,但在我看来更直观一点,将是:

      a = np.random.randint(1, 10, 10).reshape((5, 2))
      n_sampled_points = 20
      a[np.random.randint(0, a.shape[0], n_sampled_points)]
      

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多