繁体   English   中英

如何将csv读入多维数组

[英]How to read csv into multi-dimensional array

我正在尝试读取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])

您需要在每个维度上初始化字典,例如需要先将sp[int(row[0])]分配给[int(row[1])]

编辑。 根据您的用例,您可能会摆脱

sp = {}
sp[(int(row[0]), int(row[1]), ..] = float(row[4])

另一个编辑。 我以为您可能使用numpy并最终遇到以下问题: Python多维数组初始化而没有实际反映您问题的循环 它包含了非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

然后,使用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]])

假设从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]

产生以下ndarray fl

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM