我正在尝试从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])
答案 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]]])