I would like to "move" the elements of a 2D array to the new coordinates, which are stored in two other arrays. I want to automate this because my arrays are actually large (400x200x100). Some values โโwill not find its coordinates and will not be used. Some of these coordinates are masked, which I indicated in the example below using the value 0. If the coordinate is masked, the elements in the array that I want to shuffle will not be used.
import numpy as np #My new coordinates in X and Y directions mx = np.array([[ 1., 2., 3., 4., 0.], [ 1., 2., 3., 4., 0.], [ 1., 2., 3., 4., 0.], [ 1., 2., 3., 4., 0.], [ 1., 2., 3., 4., 0.]]) my = np.array([[ 0., 2., 2., 2., 2.], [ 0., 3., 3., 3., 3.], [ 0., 4., 4., 4., 4.], [ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.]]) #The array with values to move IRtest = np.array([[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414], [-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205], [-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686], [-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891], [-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]]) #Creation of zeros array to get new array b = np.zeros((5,5)) # I tried this but it doesn't work... for i in range(IRtest.shape[0]): for j in range(IRtest.shape[1]): b[my[i,j], mx[i,j]] = IRtest[i,j] plt.imshow(b) plt.colorbar() plt.show()
So, the expected array looks like this:
array_expected = np.array([[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0], [-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0], [-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
----- EDIT LATER -----------------
Better in this "orientation":
for i in range(IRtest.shape[0]): for j in range(IRtest.shape[1]): b[j, i] = IRtest[my[j,i],mx[j,i]]
And I realized:
array([[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436], [-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349], [-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144], [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495], [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]])
So, the last problem is to handle masked values โโ...
So I'm trying:
mask_mx = np.array([[False, False, False, False, True], [False, False, False, False, True], [False, False, False, False, True], [False, False, False, False, True], [False, False, False, False, True]], dtype=int) mask_my = np.array([[True, False, False, False, False], [True, False, False, False, False], [True, False, False, False, False], [True, True, True, True, True], [True, True, True, True, True]], dtype=int) mx3 = np.where(mask_mx, 'nan', mx) my3 = np.where(mask_my, 'nan', my) for i in range(IRtest.shape[0]): for j in range(IRtest.shape[1]): b[j, i] = IRtest[my3[j,i],mx3[j,i]]
But I get the error below, she doesn't like 'nan' as coordinates: invalid literal for int () with base 10: 'nan'