Numpy - 值错误:无法用序列设置数组元素
我写了一段小代码,用来计算一个文件夹里所有csv文件的平均值。
parser = argparse.ArgumentParser(description='avg data from csv to csv')
parser.add_argument('--input', required = True)
parser.add_argument('--output', required = True)
args = parser.parse_args()
# Get command arguments
input_files_path = args.input
output = args.output
avg = []
for infile in glob.glob(input_files_path+"*.csv"):
a = np.loadtxt(infile, delimiter=",")
mean = np.mean(a, axis=0)
avg.append((mean))
print infile
np.savetxt(output,(avg), fmt = "%.1f", delimiter=", ")
但是现在的问题是,当我尝试把文件名也保存到csv文件里时,像这样:
parser = argparse.ArgumentParser(description='avg data from csv to csv')
parser.add_argument('--input', required = True)
parser.add_argument('--output', required = True)
args = parser.parse_args()
# Get command arguments
input_files_path = args.input
output = args.output
avg = []
for infile in glob.glob(input_files_path+"*.csv"):
a = np.loadtxt(infile, delimiter=",")
mean = np.mean(a, axis=0)
avg.append((infile,(mean)))
print infile
np.savetxt(output,(avg), fmt = "%.1f", delimiter=", ")
程序就报错了:
np.savetxt(output,(avg), fmt = "%.1f", delimiter=", ")
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 963, in savetxt
X = np.asarray(X)
File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 235, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: cannot set an array element with a sequence
我不太明白问题出在哪里。是不是因为我试图把一个字符串(文件名)加到一个浮点数(平均值)上?我查看了numpy里的fmt
,但没有找到什么有用的信息。
/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py:773: UserWarning: loadtxt: Empty input file: "../robalo-31.1/op.csv"
warnings.warn('loadtxt: Empty input file: "%s"' % fname)
/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py:2374: RuntimeWarning: invalid value encountered in double_scalars
return mean(axis, dtype, out)
1 个回答
1
我猜你在使用 np.savetxt
的时候,提供的格式字符有问题。你用的是一个字符串和浮点数的组合,但你的分隔符让人觉得你只在用浮点数。我建议你可以用 csv
来处理这个问题:
>>> import csv
>>> import StringIO
>>> g = StringIO.StringIO()
>>> writer = csv.writer(g,delimiter=',') #this is the part that is applicable
>>> writer.writerows(lst)
>>> g.seek(0)
>>> print g.read()
foo,2
bar,4
所以我猜你的代码可以简单写成:
with open(output,'wb') as fout:
writer = csv.writer(fout,delimiter=',')
writer.writerows(avg)
而不是这样:
np.savetxt(output,(avg), fmt = "%.1f", delimiter=", ")