以 ijv/coo/triplet 格式加载矩阵的最pythonic方式是什么?
What's the most pythonic way to load a matrix in ijv/coo/triplet format?
我的输入文件是 ijv/coo/triplet 格式,带有字符串列名,例如:
Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2
应生成此 2x3 矩阵:
[[1,5,0], [0,0,2]]
我可以通过将列名放入字典并创建一个 scipy 稀疏 coo_matrix 并将该字典映射到 ID 来手动读取它。最后我想在 scipy 稀疏或 pandas 数据帧中得到它。
有没有更多的 pythonic 方法来做到这一点? Pandas只能读csv,有scipy.io
,但他们也没有coo格式。因此,如果没有库,将它放入 scipy.coo_matrix
或 pandas.DataFrame
中的最 pythonic 方式是什么?
您可以为此使用 csv:
matrix = []
with open('input_file', 'rb') as csvfile:
input_reader = csv.reader(csvfile, delimiter=',')
for row in input_reader:
matrix.append([row[0], row[1], row[2]])
然后你会在matrix
中得到这个:
[['Apple', 'Google', '1'], ['Apple', 'Banana', '5'], ['Microsoft', 'Orange', '2']]
如果你想要一个 numpy 矩阵,我相信根据 documentation 这应该可行:
nm_matrix = np.matrix(matrix)
[line.split(",") for line in open(input_file)]
行得通吗?
该代码将从文件中读取每一行,拆分为逗号分隔的行,并将结果收集到列表中。
您需要定义从 row/column 名称到某些索引的明确映射("Apple" 是“0”还是“1”并不重要,只要它表示为一个数字,因此这与您的结果不完全匹配,但这无关紧要)。在此示例中,'info.txt'
包含
Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2
这是实现坐标矩阵的一种方法:
import numpy as np
from scipy.sparse import coo_matrix
input = np.loadtxt( 'info.txt', delimiter=',' , dtype=str)
rows,cols,data = input.T
map_rows = { val:ind for ind,val in enumerate( np.unique(rows) ) }
map_cols = { val:ind for ind,val in enumerate( np.unique(cols) ) }
result = coo_matrix( (data.astype(float),( [map_rows[x] for x in rows], [map_cols[x] for x in cols]) ) )
现在你有了映射和结果
print map_rows
#{'Apple': 0, 'Microsoft': 1}
print map_cols
#{'Banana': 0, 'Google': 1, 'Orange': 2}
print result.toarray()
#array([[ 5., 1., 0.],
# [ 0., 0., 2.]])
我的输入文件是 ijv/coo/triplet 格式,带有字符串列名,例如:
Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2
应生成此 2x3 矩阵:
[[1,5,0], [0,0,2]]
我可以通过将列名放入字典并创建一个 scipy 稀疏 coo_matrix 并将该字典映射到 ID 来手动读取它。最后我想在 scipy 稀疏或 pandas 数据帧中得到它。
有没有更多的 pythonic 方法来做到这一点? Pandas只能读csv,有scipy.io
,但他们也没有coo格式。因此,如果没有库,将它放入 scipy.coo_matrix
或 pandas.DataFrame
中的最 pythonic 方式是什么?
您可以为此使用 csv:
matrix = []
with open('input_file', 'rb') as csvfile:
input_reader = csv.reader(csvfile, delimiter=',')
for row in input_reader:
matrix.append([row[0], row[1], row[2]])
然后你会在matrix
中得到这个:
[['Apple', 'Google', '1'], ['Apple', 'Banana', '5'], ['Microsoft', 'Orange', '2']]
如果你想要一个 numpy 矩阵,我相信根据 documentation 这应该可行:
nm_matrix = np.matrix(matrix)
[line.split(",") for line in open(input_file)]
行得通吗?
该代码将从文件中读取每一行,拆分为逗号分隔的行,并将结果收集到列表中。
您需要定义从 row/column 名称到某些索引的明确映射("Apple" 是“0”还是“1”并不重要,只要它表示为一个数字,因此这与您的结果不完全匹配,但这无关紧要)。在此示例中,'info.txt'
包含
Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2
这是实现坐标矩阵的一种方法:
import numpy as np
from scipy.sparse import coo_matrix
input = np.loadtxt( 'info.txt', delimiter=',' , dtype=str)
rows,cols,data = input.T
map_rows = { val:ind for ind,val in enumerate( np.unique(rows) ) }
map_cols = { val:ind for ind,val in enumerate( np.unique(cols) ) }
result = coo_matrix( (data.astype(float),( [map_rows[x] for x in rows], [map_cols[x] for x in cols]) ) )
现在你有了映射和结果
print map_rows
#{'Apple': 0, 'Microsoft': 1}
print map_cols
#{'Banana': 0, 'Google': 1, 'Orange': 2}
print result.toarray()
#array([[ 5., 1., 0.],
# [ 0., 0., 2.]])