当前位置: 首页 > 面试题库 >

如何格式化numpy savetxt,以便零仅保存为“ 0”

郭恩
2023-03-14
问题内容

我正在将numpy稀疏数组(压缩)保存到csv中。结果是我有一个3GB的CSV。问题是95%的单元格为0.0000。我用过fmt='%5.4f'。如何格式化和保存,使零仅保存为0,非零浮点数与'%5.4f'格式一起保存?如果可以的话,我敢肯定我可以将3GB降低到300MB。

我在用

np.savetxt('foo.csv', arrayDense, fmt='%5.4f', delimiter = ',')

感谢和问候


问题答案:

如果看一下的源代码np.savetxt,您会看到,虽然有很多代码可以处理参数以及Python 2和Python
3之间的差异,但最终它还是一个简单的遍历行的python循环,其中每行被格式化并写入文件。因此,如果您自己编写,就不会失去任何性能。例如,这是一个精简的函数,它写入紧凑的零:

def savetxt_compact(fname, x, fmt="%.6g", delimiter=','):
    with open(fname, 'w') as fh:
        for row in x:
            line = delimiter.join("0" if value == 0 else fmt % value for value in row)
            fh.write(line + '\n')

例如:

In [70]: x
Out[70]: 
array([[ 0.        ,  0.        ,  0.        ,  0.        ,  1.2345    ],
       [ 0.        ,  9.87654321,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.14159265,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

In [71]: savetxt_compact('foo.csv', x, fmt='%.4f')

In [72]: !cat foo.csv
0,0,0,0,1.2345
0,9.8765,0,0,0
0,3.1416,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0

然后,只要编写自己的savetxt函数,就可以使其处理稀疏矩阵,因此不必在保存之前将其转换为(密集)numpy数组。(我假设稀疏数组是使用from中的稀疏表示形式实现的scipy.sparse。)在以下函数中,唯一的变化是from... for value in row... for value in row.A[0]

def savetxt_sparse_compact(fname, x, fmt="%.6g", delimiter=','):
    with open(fname, 'w') as fh:
        for row in x:
            line = delimiter.join("0" if value == 0 else fmt % value for value in row.A[0])
            fh.write(line + '\n')

例:

In [112]: a
Out[112]: 
<6x5 sparse matrix of type '<type 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>

In [113]: a.A
Out[113]: 
array([[ 0.        ,  0.        ,  0.        ,  0.        ,  1.2345    ],
       [ 0.        ,  9.87654321,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.14159265,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

In [114]: savetxt_sparse_compact('foo.csv', a, fmt='%.4f')

In [115]: !cat foo.csv
0,0,0,0,1.2345
0,9.8765,0,0,0
0,3.1416,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0


 类似资料:
  • 问题内容: 我正在创建一个HTML表,将在Excel中作为电子表格打开。我可以使用哪种HTML标记或CSS样式“讲述” Excel以将单元格的内容显示为文本? 问题答案: 您可以将格式应用于数字,文本,日期等的单元格。 请参阅我以前关于此的答案:HTML toExcel:如何告诉Excel将列视为数字? (已调整的代码段) 如果将CSS类添加到页面: 并在您的TD上拍那些课,行得通吗?

  • 问题内容: 我正在使用Plotly offline在python中生成图形。 根据以下文档, https://plot.ly/python/offline/ 这是我的代码,可以完美地生成C:/tmp/test_plot.html文件。 如何将此图另存为png而不是html? 问题答案: 方法具有和 属性,可将文件另存为。 在上或在线查看更多详细信息。 但是,有一点需要注意的是,由于输出图像是与HT

  • 我有多个文本框,当用户在不同的文本框中键入时,我希望有一个存储所有格式化数据的数组。 格式化的数据以 m:ss 为单位(m - 分钟,s - 秒) 现在,所有不同的文本框都显示相同的值,因为只有一个this.formatTime. 我们如何改变这一点,以便v-model遍历数组,并将其添加到格式化值数组中? 文本框应显示格式化的值,并将其存储在所有格式值[]中。 我真的被困在这个,谢谢你的时间!

  • 我正在本地机器中将spark数据集保存为拼花文件。我想知道是否有任何方法可以使用某种加密算法对数据进行加密。我用来将数据保存为拼花文件的代码如下所示。 <代码>数据集。写入()。模式(“覆盖”)。拼花地板 我看到了一个类似的问题,但我的查询不同,因为我正在写入本地磁盘。

  • 问题内容: 我有以下格式化字符串的方法: 如果是负的零(,等)的输出将是。 如何使输出始终始终为负的零值和正的零值? (实现此目标相当简单,但我找不到所谓的简洁pythonic方式。理想情况下,有一个我不知道的字符串格式设置选项。) 问题答案: 加零: 您可以格式化:

  • 问题内容: 我有一个字符串“ ”,我想将其格式化为“ ”,正确的模式是什么? 我已经尝试了很多,并用谷歌搜索,但仍然找不到正确的模式。 编辑:我正在寻找Joda-Time ,而不是Java的SimpleDateFormat。 问题答案: 请注意,在JAVA SE 8中引入了新的java.time(JSR-310)包。 这代替了Joda时间,建议Joda用户进行迁移。有关JAVA SE≥8格式化日期