[Python.NET] Efficient copy of .NET Array to ctypes or numpy array
Nikhil Garg
nikhilgarg.gju at gmail.com
Sun Oct 26 10:18:40 CET 2014
Hi,
I have looked at the following thread to copy a c# array to numpy list
using python dot net.
https://mail.python.org/pipermail/pythondotnet/2014-May/001525.html
When I try the methods mentioned in the complete thread I manage to get the
array from simple iteration method or
np.fromiter, but I have not been able to make GCHandle or Marshal.Copy work
for my case.
To explain about my issue, I use a computer code written in c# which
produces output in a custom build format. I am able to access the data from
the file system using python dot net, but it seems that it take almost half
an hour to get the data from the file.
For example my file has an array of size 5018x73x400, if i use *fromiter, *i
provide the last bit of array to copy to python due to the way file stores
output.
for j in xrange(num_nodes-1):
for i in xrange(nsteps):
temp = file_in.ReadItemTimeStep(j+1,i).Data
temp_1 = np.fromiter(temp, float)
dest[j, i] = temp_1
Other way of doing same task would be to use a for loop but tht would be
really slow.
for k in xrange(num_nodes-1):
for k in xrange(nsteps):
for i in xrange(nvals):
temp[k,j,i] = file_in.ReadItemTimeStep(k+1,
j).Data[i]
I am trying to find a faster way to extract the data from the file. I was
wondering if there is a possibility to use something like GChandle or
Marshal.Copy. I have also attached same output from Marshal.Copy
Marshal.Copy(temp, 0,
IntPtr.__overloads__[int](temp2.__array_interface__['data'][0]), len(temp))
0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000, 3.13551399e-242, 4.20993645e-161,
8.71245319e-119, 8.38370432e-089, 2.60762781e-075,
1.92616374e-072, 2.89006184e-072, 3.06007265e-082,
3.81879776e-315, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000, 1.03959661e-297, 7.22038448e-196,
3.05237954e-130, 2.58469346e-093, 2.29495911e-070,
3.74354820e-062, 1.74288060e-061, 2.13172553e-067,
2.74305386e-077, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000, 0.00000000e+000, 1.02484756e-240,
1.70193770e-154, 1.30625320e-108, 1.16793762e-075,
2.96889340e-061, 7.84687103e-058, 1.16879604e-057,
5.56256478e-068, 4.06437857e-315, 0.00000000e+000,
0.00000000e+000, 0.00000000e+000, 1.11705239e-296,
1.46978156e-194, 1.98034372e-128, 3.79615170e-091,
5.88936509e-068, 1.85305929e-059, 2.16186001e-058,
Whereas the actual values stored in the array are
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 5.66641200e-37,
1.24961600e-30, 5.34846800e-25, 1.72519600e-20,
1.49402200e-17, 3.27685300e-15, 4.10687500e-13,
1.87978200e-11, 2.01397900e-10, 8.83561100e-10,
2.14397600e-09, 2.02600300e-09, 2.47599800e-09,
2.15987100e-09, 4.82694100e-10, 1.18759300e-10,
3.32024100e-11, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.45288600e-37, 7.37245900e-31, 7.59282500e-25,
5.85463400e-20, 1.20634700e-16, 3.06414300e-14,
5.16041300e-12, 2.87562800e-10, 3.62841500e-09,
1.63540600e-08, 4.06988300e-08, 3.97764200e-08,
4.88768500e-08, 4.07385000e-08, 8.78868600e-09,
I would appreciate any help i can get regarding this matter.
Nikhil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20141026/1b36f7a0/attachment.html>
More information about the PythonDotNet
mailing list