我是从csv读取的Pandas数据帧,包含X和Y坐标以及我需要放入矩阵并将其保存到文本文件中的值。所以,我创建了一个具有max(X)和max(Y)扩展名的numpy数组。
我有这个文件:
fid,x,y,agblongo_tch_alive
2368458,1,1,45.0126083457747
2368459,1,2,44.8996854102889
2368460,2,2,45.8565022933761
2358154,3,1,22.6352522929758
2358155,3,3,23.1935887499899
我需要这个:
45.01 44.89 -9999.00
-9999.00 45.85 -9999.00
22.63 -9999.00 23.19
要做到这一点,我使用这样的循环:
for row in data.iterrows():
p[int(row[1][2]),int(row[1][1])] = row[1][3]
然后使用 np.array2string 将其保存到磁盘。它有效。
由于最初的csv有68 M线,因此需要花费大量时间来处理,所以我想知道是否还有另一种更加快速和快速的方法。
答案 0 :(得分:0)
假设df
的列是'x','y','value',您可以使用高级索引
>>> x, y, value = data['x'].values, data['y'].values, data['value'].values
>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> result[y, x] = value
但是,如果coordiantes不是唯一的,那么这将无法正常工作。
在这种情况下,使用add.at
更安全(但更慢):
>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> np.add.at(result, (y, x), value)
或者,您可以创建稀疏矩阵,因为您的数据恰好是稀疏的CU格式。使用'.A'属性,您可以根据需要将其转换为普通(密集)数组:
>>> from scipy import sparse
>>> spM = sparse.coo_matrix((value, (y, x)), (y.max()+1, x.max()+1))
>>> (spM.A == result).all()
True
更新:如果fillvalue不为零,则必须修改上述内容。
方法1:用第二行替换(记住只有坐标是唯一的时才使用):
>>> result = np.full((y.max()+1, x.max()+1), fillvalue, value.dtype)
方法2:不起作用
方法3:创建spM
后执行
>>> spM.sum_duplicates()
>>> assert spM.has_canonical_format
>>> spM.data -= fillvalue
>>> result2 = spM.A + fillvalue