更简单的方法来创建矩阵/索引列表?

时间:2014-07-29 22:39:00

标签: python arrays numpy matrix indices

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

例如,让我们说我有一个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"如何以更紧凑的方式创建相同或相似的矩阵?

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

4 个答案:

答案 0 :(得分:6)

您可以使用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。)

答案 1 :(得分:4)

我认为

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

更pythonic。 ..(请注意,如果您愿意,可以使用numpy.array而不是列表...)

答案 2 :(得分: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]]

答案 3 :(得分:1)

以下是我认为你实际上想要做的事情。来自您的评论:

  

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

让我们说,为了简单起见,测试很简单,就像“积极”一样。因此,我们只是将数组转换为每个元素的“元素为正”的布尔数组,这只是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]))

不能比那简单得多。