Create Numpy 2D Array with data from triplets of (x,y,value)

Extending the answer from @MaxU, in case the coordinates are not ordered in a grid fashion (or in case some coordinates are missing), you can create your array as follows:

import numpy as np

a = np.array([(0,0,8),(0,1,5),(0,2,3),
              (1,0,4),(1,1,0),(1,2,0),
              (2,0,1),(2,1,2),(2,2,5)])

Here a represents your coordinates. It is an (N, 3) array, where N is the number of coordinates (it doesn't have to contain ALL the coordinates). The first column of a (a[:, 0]) contains the Y positions while the second columne (a[:, 1]) contains the X positions. Similarly, the last column (a[:, 2]) contains your values.

Then you can extract the maximum dimensions of your target array:

# Maximum Y and X coordinates
ymax = a[:, 0].max()
xmax = a[:, 1].max()

# Target array
target = np.zeros((ymax+1, xmax+1), a.dtype)

And finally, fill the array with data from your coordinates:

target[a[:, 0], a[:, 1]] = a[:, 2]

The line above sets values in target at a[:, 0] (all Y) and a[:, 1] (all X) locations to their corresponding a[:, 2] value (your value).

>>> target
array([[8, 5, 3],
       [4, 0, 0],
       [1, 2, 5]])

Additionally, if you have missing coordinates, and you want to replace those missing values by some number, you can initialize the array as:

default_value = -1
target = np.full((ymax+1, xmax+1), default_value, a.type)

This way, the coordinates not present in your list will be filled with -1 in the target array/


Why not using sparse matrices? (which is pretty much the format of your triplets.)

First split the triplets in rows, columns, and data using numpy.hsplit(). (Use numpy.squeeze() to convert the resulting 2d arrays to 1d arrays.)

>>> row, col, data = [np.squeeze(splt) for splt
...                   in np.hsplit(tripets, tripets.shape[-1])]

Use the sparse matrix in coordinate format, and convert it to an array.

>>> from scipy.sparse import coo_matrix
>>> coo_matrix((data, (row, col))).toarray()
array([[8, 5, 3],
       [4, 0, 0],
       [1, 2, 5]])

is that what you want?

In [37]: a = np.array([(0,0,8)
   ....:              ,(0,1,5)
   ....:              ,(0,2,3)
   ....:              ,(1,0,4)
   ....:              ,(1,1,0)
   ....:              ,(1,2,0)
   ....:              ,(2,0,1)
   ....:              ,(2,1,2)
   ....:              ,(2,2,5)])

In [38]:

In [38]: a
Out[38]:
array([[0, 0, 8],
       [0, 1, 5],
       [0, 2, 3],
       [1, 0, 4],
       [1, 1, 0],
       [1, 2, 0],
       [2, 0, 1],
       [2, 1, 2],
       [2, 2, 5]])

In [39]:

In [39]: a[:, 2].reshape(3,len(a)//3)
Out[39]:
array([[8, 5, 3],
       [4, 0, 0],
       [1, 2, 5]])

or a bit more flexible (after your comment):

In [48]: a[:, 2].reshape([int(len(a) ** .5)] * 2)
Out[48]:
array([[8, 5, 3],
       [4, 0, 0],
       [1, 2, 5]])

Explanation:

this gives you the 3rd column (value):

In [42]: a[:, 2]
Out[42]: array([8, 5, 3, 4, 0, 0, 1, 2, 5])


In [49]: [int(len(a) ** .5)]
Out[49]: [3]

In [50]: [int(len(a) ** .5)] * 2
Out[50]: [3, 3]