我想知道什么是最简单的方法来创建一个二维数组,每个行的索引都是另一个多维数组。
例如,让我们说我有一个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"如何以更紧凑的方式创建相同或相似的矩阵?
如果存在一个只接受任意多维数组并返回它的索引表的函数,那就太好了。
答案 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]))
不能比那简单得多。