I wonder what could be the easiest way to create a bi-dimensional array, that has for each row the indices to another multi-dimensional array.
For example, let's say I have a cube 4x4, the "indices matrix" would be the following:
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)
with the following result:
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]])
Besides the fact that it seems that the second column should be in place of the first, is there a more "numpythonic" way to create the same or similar matrix in a more compact way?
It would be nice if existed a function that just takes an arbitrary multi-dimensional array and returns it's index table.
I think
is more pythonic. .. (note you could use
numpy.array
instead of list if you were so inclined...)If I understand your question, there is:
indices
:This doesn't give you the results in the shape you wanted:
… but you can flatten it and transpose it:
You could use
np.indices
:There are also other utilities like
np.ndindex
, depending on your use case. (FWIW I don't think getting the coordinates in the form you're looking for is going to be as helpful as you might think it is, but YMMV.)Here's how to do what I think you actually want to do. From your comment:
Let's say, for the same of simplicity, that the test is something simple, like "is positive". So, we just transform the array into a boolean array of "element is positive" for each element, which is just
arr > 0
, and then usenonzero
to get the true indices of that boolean array:Can't get much simpler than that.