Numpy csv 脚本报错'ValueError: setting an array element with a sequence
我有一个Python脚本,它可以成功地把一个csv文件加载到一个二维的numpy数组中,并且可以根据列和行的标题提取出想要的单元格的值。为了调试,我让脚本在把数据放入numpy数组之前打印出数据矩阵的内容。当csv文件里的数据包含所有行和列的值时,脚本运行得很好。但是,当我在一个csv文件上运行脚本时,发现这个文件的末尾 apparently 有几行或几列是空的,这就导致了错误。我尝试通过在Notepad++中打开csv文件,尽量删除文件末尾的内容来解决这个问题。Notepad++让我删除了一行,但并没有显示有任何空列。经过更深入的检查,我发现Python的打印输出显示数组的末尾有两列是空的。不管怎样,编辑完csv文件后,我再次运行脚本时,打印出的数据还是一样,错误依旧,就好像我并没有从csv文件的末尾删除空行一样。我确认我已经保存了csv文件,还打开和关闭了几次这个文件,以及关闭和重新打开了Python几次,但错误仍然存在:
这是我的问题:
我该如何修改下面的脚本以避免这个错误?
这是我上面提到的函数:
def GetHSD_alpha(NumberOfColumnMeans,dfResid):
dirname=os.path.dirname(os.getcwd())
resources=os.path.join(dirname,'resources')
inputfile=os.path.join(resources,'CriticalValuesOfTukeysHSD_a_0_01.csv')
separator=','
ColumnIndex=NumberOfColumnMeans
RowIndex=dfResid
cast = p.cast
data = [[] for dummy in xrange(13)]
for line in open(inputfile, 'r'):
fields = line.strip().split(separator)
for i, number in enumerate(fields):
data[i].append(number)
print 'data HSD alpha is: ',data
time.sleep(2)
CriticalValuesArray=p.array(data)
HSD_alpha_0_01=CriticalValuesArray[ColumnIndex,RowIndex]
return HSD_alpha_0_01
另外,作为参考,这里是打印数据的一个简化版本,它导致了错误。注意到末尾有空元素,我似乎无法在运行脚本之前手动从csv文件中删除它们:
数据 HSD alpha 是: [['', '5', '6', '7'], ['2', '5.7', '5.24', '4.95'], ['3', '6.98', '6.33', '5.92'], ['11', '10.48', '9.3', '8.55'], [], []]
同样作为参考,这里是从另一个csv文件打印的数据的简化版本,这个文件在脚本中导入用于调试。下面打印的数据没有导致脚本出错:
数据 HSD alpha 是: [['', '1', '2', '3'], ['1', '4052', '98.49', '34.12'], ['2', '4999', '99.01', '30.81'], ['3', '5403', '99.17', '29.46']]
再次强调,当我在Notepad++中打开这些csv文件时,似乎没有任何空列或空行,我仔细检查过这些数据文件。
最后,我想象空行和空列的数量可能会有所不同,所以任何解决方案都需要能够处理不同数量的空行和空列。
谢谢大家的帮助。
2 个回答
你为什么要自己写一个CSV加载器呢?
你可以用numpy.loadtxt来加载数据吗?或者在你这种有缺失值的情况下,可以用numpy.genfromtxt。
找到了答案。
我需要把下面这行代码改一下:
data = [[] for dummy in xrange(11)]
xrange 的值应该设为 11,而不是 13。
这个答案很简单,但我花了很多时间才找到。
这个讨论现在已经有了答案,可以结束了。