【问题标题】:Simpler way to create a matrix/list of indices?创建索引矩阵/列表的更简单方法?
【发布时间】:2014-09-21 11:08:21
【问题描述】:

我想知道创建二维数组的最简单方法是什么,它的每一行都有另一个多维数组的索引。

例如,假设我有一个 4x4 的立方体,“索引矩阵”将如下所示:

np.concatenate([
    np.expand_dims(curr.ravel(),axis=0).T
    for curr
    in np.meshgrid(
        np.arange(4),
        np.arange(4),
        np.arange(4)
    )
],axis=1)

结果如下:

array([[0, 0, 0],
      [0, 0, 1],
      [0, 0, 2],
      [0, 0, 3],
      [1, 0, 0],
      [1, 0, 1],
      ...
      [2, 3, 2],
      [2, 3, 3],
      [3, 3, 0],
      [3, 3, 1],
      [3, 3, 2],
      [3, 3, 3]])

除了似乎第二列应该代替第一列这一事实之外,是否有更“numpythonic”的方式来以更紧凑的方式创建相同或相似的矩阵?

如果存在一个只接受任意多维数组并返回它的索引表的函数,那就太好了。

【问题讨论】:

  • 最大的问题是:你为什么要这个?例如,如果您打算过滤索引数组然后使用它进行索引,那么有更好的方法来做到这一点。
  • 我会尽量用几句话来解释我的目标:我需要测试一些存储在 3 维数组中的概率值。如果它们通过了一些测试条件,那么我会将它们添加到将在 3d 散点图中可视化的坐标列表中。更大的图景:我正在尝试为在 3 维(特征)中运行的线性判别分析分类器(多类)可视化决策边界。
  • 好的,最简单的方法不是从arr获取所有索引,然后根据arr中对应值通过测试条件的索引进行过滤;相反,只需将测试应用于 arr 以获取布尔数组,然后获取该布尔数组中真实值的索引。

标签: python arrays numpy matrix indices


【解决方案1】:

我觉得

list(itertools.product(range(4),range(4),range(4)))

更符合 Python 风格。 ..(请注意,如果您愿意,可以使用 numpy.array 而不是 list...)

【讨论】:

  • 这可能更符合 Python 风格,但没有那么“numpythonic”,而且对于大型数组来说可能是个坏主意……不过,对于非 NumPy Python 程序员来说,它可读的事实显然是一个优势至少有一些用例。
【解决方案2】:

你可以使用np.indices:

>>> a = np.random.random((4,4,4))
>>> np.indices(a.shape).reshape((a.ndim, -1)).T
array([[0, 0, 0],
       [0, 0, 1],
       [0, 0, 2],
       [0, 0, 3],
       [0, 1, 0],
       [0, 1, 1],
[...]
       [3, 3, 2],
       [3, 3, 3]])

还有其他实用程序,例如 np.ndindex,具体取决于您的用例。 (FWIW 我不认为以您正在寻找的形式获取坐标会像您想象的那样有用,但是 YMMV。)

【讨论】:

    【解决方案3】:

    如果存在一个只接受任意多维数组并返回它的索引表的函数,那就太好了。

    如果我理解你的问题,有:indices:

    i = np.indices(a.shape)
    

    这不会为您提供所需形状的结果:

    >>> a = np.array([[1,2], [3,4], [5,6]])
    >>> print(np.indices(a.shape))
    [[[0 0]
      [1 1]
      [2 2]]
    
     [[0 1]
      [0 1]
      [0 1]]]
    

    ……但你可以将其展平并转置:

    [[0 0]
     [0 1]
     [1 0]
     [1 1]
     [2 0]
     [2 1]]
    

    【讨论】:

      【解决方案4】:

      以下是我认为您真正想要做的事情。根据您的评论:

      我需要测试一些存储在 3 维数组中的概率值。如果它们通过了一些测试条件,那么我会将它们添加到将在 3d 散点图中可视化的坐标列表中。

      为了简单起见,假设测试很简单,例如“阳性”。因此,我们只需将数组转换为每个元素的“元素为正数”的布尔数组,即 arr > 0,然后使用 nonzero 获取该布尔数组的真实索引:

      >>> arr = np.array([[-1, 1], [2, -2], [-3, -3]])
      >>> print(arr > 0)
      [[False  True]
       [ True False]
       [False False]]
      >>> print(np.nonzero(arr > 0))
      (array([0, 1]), array([1, 0]))
      

      没有比这更简单的了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多