[英]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
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.