On Thu, Sep 1, 2016 at 3:49 PM, Florian Lindner <mailinglists@xgm.de> wrote:

>

> Hello,

>

> thanks for your reply which was really helpful!

>

> My problem is that I discovered that the data I got is rather unordered.

>

> The documentation for reshape says: Read the elements of a using this index order, and place the elements into the

> reshaped array using this index order. ‘C’ means to read / write the elements using C-like index order, with the last

> axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to read / write the elements using

> Fortran-like index order, with the first index changing fastest, and the last index changing slowest.

>

> With my data both dimensions change, so there is no specific ordering of the points, just a bunch of arbitrarily mixed

> "x y z value" data.

>

> My idea is:

>

> out = np.loadtxt(...)

> x = np.unique(out[:,0])

> y = np.unique[out]:,1])

> xx, yy = np.meshgrid(x, y)

>

> values = lookup(xx, yy, out)

>

> lookup is ufunc (I hope that term is correct here) that looks up the value of every x and y in out, like

> x_filtered = out[ out[:,0] == x, :]

> y_filtered = out[ out[:,1] == y, :]

> return y_filtered[2]

>

> (untested, just a sketch)

>

> Would this work? Any better way?

If the (x, y) values are actually drawn from a rectilinear grid, then you can use np.lexsort() to sort the rows before reshaping.

--

Robert Kern

>

> Hello,

>

> thanks for your reply which was really helpful!

>

> My problem is that I discovered that the data I got is rather unordered.

>

> The documentation for reshape says: Read the elements of a using this index order, and place the elements into the

> reshaped array using this index order. ‘C’ means to read / write the elements using C-like index order, with the last

> axis index changing fastest, back to the first axis index changing slowest. ‘F’ means to read / write the elements using

> Fortran-like index order, with the first index changing fastest, and the last index changing slowest.

>

> With my data both dimensions change, so there is no specific ordering of the points, just a bunch of arbitrarily mixed

> "x y z value" data.

>

> My idea is:

>

> out = np.loadtxt(...)

> x = np.unique(out[:,0])

> y = np.unique[out]:,1])

> xx, yy = np.meshgrid(x, y)

>

> values = lookup(xx, yy, out)

>

> lookup is ufunc (I hope that term is correct here) that looks up the value of every x and y in out, like

> x_filtered = out[ out[:,0] == x, :]

> y_filtered = out[ out[:,1] == y, :]

> return y_filtered[2]

>

> (untested, just a sketch)

>

> Would this work? Any better way?

If the (x, y) values are actually drawn from a rectilinear grid, then you can use np.lexsort() to sort the rows before reshaping.

[~/scratch]

|4> !cat random-mesh.txt

0.3 0.3 21

0 0 10

0 0.3 11

0.3 0.6 22

0 0.6 12

0.6 0.3 31

0.3 0 20

0.6 0.6 32

0.6 0 30

[~/scratch]

|5> scrambled_nodes = np.loadtxt('random-mesh.txt')

# Note! Put the "faster" column before the "slower" column!

[~/scratch]

|6> i = np.lexsort([scrambled_nodes[:, 1], scrambled_nodes[:, 0]])

[~/scratch]

|7> sorted_nodes = scrambled_nodes[i]

[~/scratch]

|8> sorted_nodes

array([[ 0. , 0. , 10. ],

[ 0. , 0.3, 11. ],

[ 0. , 0.6, 12. ],

[ 0.3, 0. , 20. ],

[ 0.3, 0.3, 21. ],

[ 0.3, 0.6, 22. ],

[ 0.6, 0. , 30. ],

[ 0.6, 0.3, 31. ],

[ 0.6, 0.6, 32. ]])

Then carry on with the reshape()ing as before. If the grid points that "ought to be the same" are not actually identical, then you may end up with some problems, e.g. if you had "0.300000000001 0.0 20.0" as a row, but all of the other "x=0.3" rows had "0.3", then that row would get sorted out of order. You would have to clean up the grid coordinates a bit first.

--

Robert Kern