我有一个数值密集型的矢量化python函数def f(x,y)
,它包含两个变量,(具有frompyfunc
和广播)在x
的np.数组X = [x0, ...., xN-1]
和y
的np.数组Y = [y0, ...., yM-1]
上,其中N和M介于5千和1万之间。这将返回形状为(N,M)包含z[i,j]
,使得z[i,j] = f(X[i], Y[j])
对所有i和j。函数f
被优化,这已经花费了大约45分钟。当我使用Z
编写、调试、分析代码时,我想将"矩阵" Z
"保存"在csv文件中,格式如下:
0.25 0.5 0.75 1 1.25
0.1 0.876155737 0.888282356 0.904731158 0.910351368 0.906284762
0.2 0.810528369 0.797068044 0.806520168 0.805697704 0.80659234
0.3 0.696280633 0.704307378 0.703540949 0.705198518 0.708672067
0.4 0.601264163 0.605194 0.607882 0.611616655 0.612408848
0.5 0.502995372 0.509209974 0.513651558 0.516065068 0.51994982
(this是我的"矩阵"的左上角的一小部分,第一列是X
的开始,第一行是Y
的开始,其余的是矩阵,意思是例如f(0.4, 0.75) = 0.607882
。
我很自然地使用了pd.dataframe
,如下所示:
df = pd.DataFrame(data=Z, columns=Y, index=X)
df.to_csv(some_full_path_filename)
实际上,csv文件看起来就像我希望它看起来的那样,也就是说,就像上面矩阵中的一小部分。
现在如果我
df2 = pd.read_csv(some_full_path_filename)
df2 .to_csv(some_full_path_filename2, index=False)
第二个csv文件如下所示:
Unnamed:0 0.25 0.5 0.75 1 1.25
0.1 0.876155737 0.888282356 0.904731158 0.910351368 0.906284762
0.2 0.810528369 0.797068044 0.806520168 0.805697704 0.80659234
0.3 0.696280633 0.704307378 0.703540949 0.705198518 0.708672067
0.4 0.601264163 0.605194 0.607882 0.611616655 0.612408848
0.5 0.502995372 0.509209974 0.513651558 0.516065068 0.51994982
这是最接近的第一个csv文件,我成功地获得,而尝试自己与Pandas。当然,两个 Dataframe df
和df2
是不"相等"。
因此,这个问题的标题是:一个操作是 * 对合的 ,当应用它两次时给出起始值,则否, my *" Dataframe 到csv文件"和"csv文件到 Dataframe "操作不是对合的。
准确地说, Dataframe 和csv文件中存在浮点舍入差异,例如,在一个文件中,矩阵中可能有0.0072618782055291
,但在另一个文件中,在同一位置,我可能有0.0072618782055290999999999
:这对我来说不是问题。
我想要的是 * my *" Dataframe 到csv文件"和"csv文件到 Dataframe "操作,以使 Dataframe 和csv文件在结构上相等。
"结构上"的意思是:
- 对于csv文件:在每个"单元格"中具有相同的值(向上舍入)和字符串(如果有)
- 对于 Dataframe :当然,它们本身并不相等,因为它们并不"指向"所分配内存中的相同位置,但我希望它们相等,因为它们中的所有数字/文本值都表示相同的数字/字符串(直到对数字进行舍入)
1条答案
按热度按时间0dxa2lsx1#
这应该是不同的,因为在csv中所有数据都像字符串一样保存,所以如果在这里使用
index_col=0
是正确的,创建FloatIndex
,但列名是字符串,列中的数据也应该以不同的方式解析(例如,如果混合字符串和数字):另一个想法是使用
pickle
、read_pickle
和DataFrame.to_pickle
来正确保存带有列和索引的DataFrame: