Python 如何将csv读入多维数组
我试图从CSV中读取,其中前四列是多维数组的索引。我得到一个错误:Python 如何将csv读入多维数组,python,python-2.7,Python,Python 2.7,我试图从CSV中读取,其中前四列是多维数组的索引。我得到一个错误: KeyError: 0 发件人: 您需要在每个维度上初始化一个字典,例如sp[int(第[0]行])]需要先分配给它,然后才能使用[int(第[1]行])] 编辑。根据您的用例,您可能会侥幸逃脱 sp = {} sp[(int(row[0]), int(row[1]), ..] = float(row[4]) 又一次编辑。我在想你可能会使用numpy,最后问了这个问题:这实际上反映了你的问题。它包含一个非numpy解决方案作
KeyError: 0
发件人:
您需要在每个维度上初始化一个字典,例如
sp[int(第[0]行])]
需要先分配给它,然后才能使用[int(第[1]行])]
编辑。根据您的用例,您可能会侥幸逃脱
sp = {}
sp[(int(row[0]), int(row[1]), ..] = float(row[4])
又一次编辑。我在想你可能会使用
numpy
,最后问了这个问题:这实际上反映了你的问题。它包含一个非numpy
解决方案作为可接受的答案。不过,您需要知道此结构的维度。您可以使用这样一个字典字典来代替数组,以避免事先预先分配整个结构:
from collections import defaultdict
tree = lambda: defaultdict(tree)
sp = tree()
print 3 in sp[1][2] # -> False
sp[1][2][3] = 4.1
print 3 in sp[1][2] # -> True
print sp[1][2][3] # -> 4.1
sp[9][7][9] = 5.62
sp[4][2][0] = 6.29
使用Numpy怎么样?sp.csv可能如下所示:
0,0,0,4.1
1,1,2,5.2
0,1,1,3.2
然后,使用,从文件读取成为一行:
import numpy as np
sp = np.loadtxt('sp.csv', delimiter=',')
这将生成一个2D记录数组:
array([[ 0. , 0. , 0. , 4.1],
[ 1. , 1. , 2. , 5.2],
[ 0. , 1. , 1. , 3.2]])
假设基于0的索引,将此稀疏矩阵转换为完整的ndarray的工作方式如下。我对idx=
行不满意(必须有一种更直接的方法),但它可以工作:
max_indices = sp.max(0)[:-1]
fl = np.zeros(max_indices + 1)
for row in sp:
idx = tuple(row[:-1].astype(int))
fl[idx] = row[-1]
导致以下数据列fl
:
array([[[ 4.1, 0. , 0. ],
[ 0. , 3.2, 0. ]],
[[ 0. , 0. , 0. ],
[ 0. , 0. , 5.2]]])
唉,那么n^4呢?我认为python比这更好:(collections.defaultdict有帮助,但只有一个级别)deep@Tjorriemorrie:虽然多维数组需要更多的内存,但您可以使其成为字典的字典,从而避免必须预先分配其中的每个条目。@martineau my bad在我的评论中已经想到了字典。然而,即使是sp[int(row[0])]默认为{},需要在[int(行[1])位置将其初始化为新的{}在分配到之前it@Nicolas78:可以使用
defaultdict
并避免进行所有的初始化--它被调用。请看我的答案。这是一件美妙的事情。我似乎无法实现这一点,您可以再详细说明一下吗?我的sp[1][2][3]
返回defaultdict(,{})
这是因为您在引用其内容之前没有为sp[1][2][3]分配一个终端(也称为“叶子”)值,所以默认情况下会自动创建一个空的defaultdict
(也称为“分支”节点)。这不是因为sp[1][2]中的defaultdict
而引发的keyrerror:3
(也是自动创建的)没有该键的值。
array([[[ 4.1, 0. , 0. ],
[ 0. , 3.2, 0. ]],
[[ 0. , 0. , 0. ],
[ 0. , 0. , 5.2]]])