1

i want to make a function that will return an array of booleans. Basically the code will check the equality of elements inside a 4-D array. It will through 2nd and 3rd dimension and compare every array whether they all are equal or not. Here's my current code :

x = np.arange(0,72).reshape(4,2,3,3)

x[:,1,2,:] = 0

def equality(arr):
    return np.array([np.allclose(arr[:,i,j,:],arr[:,i,j,:+1]) for i in range(arr.shape[1]) for j in range(arr.shape[2])])

print(x)
print(equality(x))

Output :

 [[[[ 0  1  2]    [ 3  4  5]    [ 6  7  8]]
 
   [[ 9 10 11]    [12 13 14]    [ 0  0  0]]]
 
 
  [[[18 19 20]    [21 22 23]    [24 25 26]]
 
   [[27 28 29]    [30 31 32]    [ 0  0  0]]]
 
 
  [[[36 37 38]    [39 40 41]    [42 43 44]]
 
   [[45 46 47]    [48 49 50]    [ 0  0  0]]]
 
 
  [[[54 55 56]    [57 58 59]    [60 61 62]]
 
   [[63 64 65]    [66 67 68]    [ 0  0  0]]]] [False False False False
 False  True]

That code works, but is there a way to get rid of that for loop using numpy stuff instead?

1 Answer 1

1

Use np.ndarray.reshape and numpy.transpose to get to desired shape. To get an intuition about the order, check this question. Then check if all columns in sub_arrays are equal:

>>> reshaped = np.transpose(x.reshape(4,6,3), axes=(1,0,2))
# 1st dim==4, 2nd*3rd dim==6, 4th dim==3, hence reshape(4,6,3)
>>> reshaped

array([[[ 0,  1,  2],
        [18, 19, 20],
        [36, 37, 38],
        [54, 55, 56]],

       [[ 3,  4,  5],
        [21, 22, 23],
        [39, 40, 41],
        [57, 58, 59]],

       [[ 6,  7,  8],
        [24, 25, 26],
        [42, 43, 44],
        [60, 61, 62]],

       [[ 9, 10, 11],
        [27, 28, 29],
        [45, 46, 47],
        [63, 64, 65]],

       [[12, 13, 14],
        [30, 31, 32],
        [48, 49, 50],
        [66, 67, 68]],

       [[ 0,  0,  0],
        [ 0,  0,  0],
        [ 0,  0,  0],
        [ 0,  0,  0]]])

>>> (reshaped == reshaped[:, :, -1:]).all(1).all(1)
array([False, False, False, False, False,  True])
Sign up to request clarification or add additional context in comments.

1 Comment

ahh, i see, so you need to basically group them together (?), anyway thank you very much!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.