Discussion:
[Numpy-discussion] Reading in a mesh file
Florian Lindner
2016-08-31 15:00:20 UTC
Permalink
Hello,

I have mesh (more exactly: just a bunch of nodes) description with values associated to the nodes in a file, e.g. for a
3x3 mesh:

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

What is best way to read it in and get data structures like the ones I get from np.meshgrid?

Of course, I know about np.loadtxt, but I'm having trouble getting the resulting arrays (x, y, values) in the right form
and to retain association to the values.

Thanks,
Florian
Robert Kern
2016-08-31 15:06:57 UTC
Permalink
Post by Florian Lindner
Hello,
I have mesh (more exactly: just a bunch of nodes) description with values
associated to the nodes in a file, e.g. for a
Post by Florian Lindner
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
What is best way to read it in and get data structures like the ones I get from np.meshgrid?
Of course, I know about np.loadtxt, but I'm having trouble getting the
resulting arrays (x, y, values) in the right form
Post by Florian Lindner
and to retain association to the values.
For this particular case (known shape and ordering), this is what I would
do. Maybe throw in a .T or three depending on exactly how you want them to
be laid out.

[~/scratch]
|1> !cat mesh.txt

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

[~/scratch]
|2> nodes = np.loadtxt('mesh.txt')

[~/scratch]
|3> 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. ]])

[~/scratch]
|4> reshaped = nodes.reshape((3, 3, -1))

[~/scratch]
|5> reshaped
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. ]]])

[~/scratch]
|7> x = reshaped[..., 0]

[~/scratch]
|8> y = reshaped[..., 1]

[~/scratch]
|9> values = reshaped[..., 2]

[~/scratch]
|10> x
array([[ 0. , 0. , 0. ],
[ 0.3, 0.3, 0.3],
[ 0.6, 0.6, 0.6]])

[~/scratch]
|11> y
array([[ 0. , 0.3, 0.6],
[ 0. , 0.3, 0.6],
[ 0. , 0.3, 0.6]])

[~/scratch]
|12> values
array([[ 10., 11., 12.],
[ 20., 21., 22.],
[ 30., 31., 32.]])

--
Robert Kern
Florian Lindner
2016-09-01 14:49:57 UTC
Permalink
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?

Thanks,
Florian
Post by Florian Lindner
Hello,
I have mesh (more exactly: just a bunch of nodes) description with values associated to the nodes in a file, e.g. for a
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
What is best way to read it in and get data structures like the ones I get from np.meshgrid?
Of course, I know about np.loadtxt, but I'm having trouble getting the resulting arrays (x, y, values) in the right form
and to retain association to the values.
For this particular case (known shape and ordering), this is what I would do. Maybe throw in a .T or three depending on
exactly how you want them to be laid out.
[~/scratch]
|1> !cat mesh.txt
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
[~/scratch]
|2> nodes = np.loadtxt('mesh.txt')
[~/scratch]
|3> 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. ]])
[~/scratch]
|4> reshaped = nodes.reshape((3, 3, -1))
[~/scratch]
|5> reshaped
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. ]]])
[~/scratch]
|7> x = reshaped[..., 0]
[~/scratch]
|8> y = reshaped[..., 1]
[~/scratch]
|9> values = reshaped[..., 2]
[~/scratch]
|10> x
array([[ 0. , 0. , 0. ],
[ 0.3, 0.3, 0.3],
[ 0.6, 0.6, 0.6]])
[~/scratch]
|11> y
array([[ 0. , 0.3, 0.6],
[ 0. , 0.3, 0.6],
[ 0. , 0.3, 0.6]])
[~/scratch]
|12> values
array([[ 10., 11., 12.],
[ 20., 21., 22.],
[ 30., 31., 32.]])
--
Robert Kern
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
Robert Kern
2016-09-01 15:03:11 UTC
Permalink
Post by Florian Lindner
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
Post by Florian Lindner
reshaped array using this index order. ‘C’ means to read / write the
elements using C-like index order, with the last
Post by Florian Lindner
axis index changing fastest, back to the first axis index changing
slowest. ‘F’ means to read / write the elements using
Post by Florian Lindner
Fortran-like index order, with the first index changing fastest, and the
last index changing slowest.
Post by Florian Lindner
With my data both dimensions change, so there is no specific ordering of
the points, just a bunch of arbitrarily mixed
Post by Florian Lindner
"x y z value" data.
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
Post by Florian Lindner
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

Loading...