【问题标题】:python save numpy array with only non-zero elementspython保存只有非零元素的numpy数组
【发布时间】:2019-02-17 20:11:40
【问题描述】:

我有一个大多数元素为零的数组。

A =  [ 1,0,2
       2,3,0
       0,0,4 ]

我想把它另存为

rowid[0] colid[0] 1
rowid[0] colid[2] 2
rowid[1] colid[0] 2
rowid[1] colid[1] 3
rowid[2] colid[2] 4

这里的 rowid 和 colid 是数组,它们将数组索引映射到原始文件中的实际条目。

如何在不使用 for 循环的情况下做到这一点?

【问题讨论】:

  • 有一个 scipy.sparse 包可以处理这样的矩阵。
  • @hpaulj,我正在寻找一种方法以指定格式在纯文本文件中写入这样的数组
  • 应该很容易遍历argwhere。使用您自己的行格式。
  • 你想让你的输出字面上有字符串"rowid[0]"等吗?
  • 想想看,savetxt 可以用更高级的格式,比如fmt='row[%d] col[%d] %d'

标签: python arrays python-2.7 numpy


【解决方案1】:
A = np.array(A).reshape(3, 3) # make A a 3x3 numpy array 
i, j = np.where(A != 0) # find indices where it is nonzero 
v = A[i, j] # extract nonzero values of the array 
np.savetxt('file.csv', np.vstack((i, j, v)).T, delimiter = ',') # stack and save 

# @Daniel F suggestion is to make header with array shape and add delimiter kwarg
np.savetxt('file.csv', np.vstack((i, j, v)).T, delimiter = ',', header = str(A.shape))

【讨论】:

  • 可能想要savetxt中的header值来存储数组的原始形状,这样如果非常稀疏也可以正确重建。
  • 并设置delimiter = ','如果你想要一个合适的*.csv
  • 修正了一些格式并在您的原始答案中添加了delimiter = ','
猜你喜欢
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
相关资源
最近更新 更多