Python 如何将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解决方案作

我试图从CSV中读取,其中前四列是多维数组的索引。我得到一个错误:

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]]])