Python Forum
from numpy array to csv - rounding - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: from numpy array to csv - rounding (/thread-38706.html)



from numpy array to csv - rounding - SchroedingersLion - Nov-14-2022

Greetings,

I have a 2D numpy array
ARR
storing a bunch of floats. I want to print it row by row to a .csv file, but rounded to 3 significant digits.
Is there a simple way to do this?
This is what I currently have. It prints the array without rounding.
    
with open('./results', 'w') as f:
        writer = csv.writer(f, delimiter=" ")
                 
        for row in ARR:
            writer.writerow(row)  
Cheers!


RE: from numpy array to csv - rounding - snippsat - Nov-14-2022

Take into Pandas the can use .to_csv with float_format.
import numpy as np
import pandas as pd

arr_rand = np.random.rand(3,4)
df = pd.DataFrame(arr_rand)
>>> df
          0         1         2         3
0  0.440761  0.337663  0.372010  0.892344
1  0.952017  0.747404  0.787696  0.338794
2  0.690075  0.061731  0.541146  0.968825

>>> print(df.to_csv(index=False, header=False, line_terminator='\n', float_format='%.3f').strip())
0.441,0.338,0.372,0.892
0.952,0.747,0.788,0.339
0.690,0.062,0.541,0.969



RE: from numpy array to csv - rounding - deanhystad - Nov-14-2022

The simplest way might be to use pandas.
import numpy as np
import pandas as pd
# Make a float numpy array
data = np.array([[a/b for b in range(1,11)] for a in range(1,11)])
# Write to csv file
df = pd.DataFrame(data)
df.to_csv("test.csv", index=False, header=False)
Output:
1.0,0.5,0.3333333333333333,0.25,0.2,0.16666666666666666,...
Another way to do this is convert all the numbers to strings and write the strings to the csv file.


RE: from numpy array to csv - rounding - SchroedingersLion - Nov-14-2022

Thank you, you two!

I just found another way. Apparently, numpy offers a rounding function for their arrays, so one can just call
ARR.round(decim)
where
ARR
is a numpy array to be rounded to
decim
signifiant figures.

Then my snippet from above can be used.


RE: from numpy array to csv - rounding - deanhystad - Nov-14-2022

I was solving the wrong problem. I saw CSV and rounding and immediately jumped to the conclusion that you were not happy about losing precision when saving your numpy array to a file. That is the complaint in 99.9% of posts that include "csv" and "rounding" in their topic. Sorry for wasting your time.

Curious though, why do you want to round floats to 3 digits in a csv file? It's not like csv is a presentation format.


RE: from numpy array to csv - rounding - SchroedingersLion - Nov-14-2022

(Nov-14-2022, 08:25 PM)deanhystad Wrote: Curious though, why do you want to round floats to 3 digits in a csv file? It's not like csv is a presentation format.

I want to lose precision so that the file size does not get unnecessarily large. Saving, say, 5 digits instead of the usual 15 saves a factor 3 then. I work in scientific computing and result files often store millions of floats, so stuff like this pays off.


RE: from numpy array to csv - rounding - deanhystad - Nov-14-2022

Why not use a binary format? Numpy loves binary. A float is 4 bytes. More precision than 6 ascii characters (need a separator). Much faster to read and write.

Or is this some kind of intermediary that has to be readable by programs where numpy is not an option?