如何将csv读入多维数组

时间:2014-05-17 12:32:55

标签: python python-2.7

我正在尝试从CSV中读取前四列是多维数组的索引。我收到错误:

KeyError: 0

从:

sp = []
csvFile = open("sp.csv", "rb")
csvReader = csv.reader(csvFile)
for row in csvReader:
    print row
    sp[int(row[0])][int(row[1])][int(row[2])][int(row[3])] = float(row[4])

3 个答案:

答案 0 :(得分:2)

您需要在每个维度初始化字典,例如sp[int(row[0])]需要先分配到[int(row[1])]才能使用sp = {} sp[(int(row[0]), int(row[1]), ..] = float(row[4])

进行访问

编辑。根据您的使用情况,您可以使用

numpy

又一个编辑。我原以为你可以使用numpy并最终得到这个问题:Python multi-dimensional array initialization without a loop这实际上反映了你的问题。它包含非{{1}}解决方案作为已接受的答案。但是,你需要知道这方面的尺寸。

答案 1 :(得分:2)

您可以使用这样的字典字典而不是数组,以避免事先预先分配整个结构:

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

答案 2 :(得分:1)

如何使用 Numpy ? sp.csv可能如下所示:

0,0,0,4.1
1,1,2,5.2
0,1,1,3.2

然后,使用Numpy,从文件中读取变为一行:

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

将此稀疏矩阵转换为完整的ndarray就像这样,假设基于0的索引。我对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]

导致以下ndarray fl

array([[[ 4.1,  0. ,  0. ],
        [ 0. ,  3.2,  0. ]],

       [[ 0. ,  0. ,  0. ],
        [ 0. ,  0. ,  5.2]]])