5

I have a 3D numpy array that looks like this:

 X = [[[10  1]   [ 2 10]   [-5  3]]

  [[-1 10]   [ 0  2]   [ 3 10]]

  [[ 0  3]   [10  3]   [ 1  2]]

  [[ 0  2]   [ 0  0]   [10  0]]]

At first I want the maximum along axis zero with X.max(axis = 0)):

which gives me:

 [[10 10]  [10 10]  [10 10]]

The next step is now my problem; I would like to call the location of each 10 and create a new 2D array from another 3D array which has the same dimeonsions as X.

for example teh array with same dimensions looks like that:

 Y = [[[11  2]   [ 3 11]   [-4  100]]

  [[ 0 11]   [ 100  3]   [ 4 11]]

  [[ 1  4]   [11  100]   [ 2  3]]

  [[ 100  3]   [ 1  1]   [11  1]]]

I want to find the location of the maximum in X and create a 2D array from the numbers and location in Y.

the answer in this case should then be:

 [[11 11]  [11 11]  [11 11]]

Thank you for your help in advance :)

BastHut
  • 90
  • 6

2 Answers2

4

you can do this with numpy.argmax and numpy.indices.

import numpy as np

X = np.array([[[10, 1],[ 2,10],[-5, 3]],
              [[-1,10],[ 0, 2],[ 3,10]],
              [[ 0, 3],[10, 3],[ 1, 2]],
              [[ 0, 2],[ 0, 0],[10, 0]]])

Y = np.array([[[11, 2],[ 3,11],[-4, 100]],
              [[ 0,11],[ 100, 3],[ 4,11]],
              [[ 1, 4],[11, 100],[ 2, 3]],
              [[ 100, 3],[ 1, 1],[11, 1]]])

ind = X.argmax(axis=0)
a1,a2=np.indices(ind.shape)

print X[ind,a1,a2]
# [[10 10]
#  [10 10]
#  [10 10]]

print Y[ind,a1,a2]
# [[11 11]
#  [11 11]
#  [11 11]]

The answer here provided the inspiration for this

Community
  • 1
  • 1
tmdavison
  • 64,360
  • 12
  • 187
  • 165
2

You could try

Y[X==X.max(axis=0)].reshape(X.max(axis=0).shape)
Noel Segura Meraz
  • 2,265
  • 1
  • 12
  • 17