我有一个尺寸为1000 * 30 * 150的numpy数组。我试图将其保存为txt文件。到目前为止,我已经尝试了这个
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1254, in savetxt
fh.write(asbytes(format % tuple(row) + newline))
TypeError: only length-1 arrays can be converted to Python scalars
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
np.savetxt("test.txt", train, fmt='%.5f', delimiter=",")
File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1258, in savetxt
% (str(X.dtype), format))
TypeError: Mismatch between array dtype ('float64') and format specifier ('%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f')
两种方法都给我错误
Error:
ContractsControllerTest#test_should_get_show:
ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError
Error:
ContractsControllerTest#test_should_get_show:
NoMethodError: undefined method `each' for nil:NilClass
答案 0 :(得分:4)
问题是你的阵列是三维的,不能以二维格式保存。要么重塑它,所以它是2d:
mydata = mydata.reshape(mydata.shape[0],mydata.shape[1]*mydata.shape[2])
np.savetxt('text.txt',mydata,fmt='%.5f',delimiter=',')
或者如果您不需要将其作为文本文件阅读并希望稍后在python使用中重新加载它:
np.save('text.npy',mydata)
答案 1 :(得分:2)
你没有提到将三维数组写入文本文件的目的是什么,你将来会再读它,你想要的是什么格式,但这是一种可能性:
import json
print(json.dumps(mydata, default=lambda x: list(x), indent=4))
如果您澄清目的,人们将能够提出更合适的解决方案。
答案 2 :(得分:1)
告诉我们mydata
。特别是其dtype
和shape
。
要以%.5f
格式保存,它需要是一个二维数组。
savetxt
大致如此:
for row in arr:
print(format % tuple(row))
其中format
是根据您的fmt
参数和数组中的数字列构建的。您的数组看起来有很多列,因此format
是'%.5f,%.5f,%.5f,%.5f,%.5f,%...
字符串。
tuple
才能将1d数组row
转换为与format%()
一起使用的元组。
如果数组是更高的维度或对象数组,则会出现问题。
编辑 - 所以你说数组是1000 * 30 * 150。因此它尝试迭代1000行,30看起来像format
的大小。但它无法将其应用于(30,150)
数组。
使用open
和row
迭代,您会得到相同的错误吗?在Py3中,您可能需要使用'wb'. Iterating yourself on the first dimension means each
savetxt call works with a 30x150 array. It will iterate on the 30, and try to format rows of 150. The would create a larger
格式打开,但我认为这样会运行。
在任何情况下,savetxt
都是为2d数字数组设计的。 3d需要某种软糖。请记住,csv
读者也不是为3d数组设计的。他们期望具有一致列的行由简单的分隔符分隔。
In [260]: arr = np.arange(24).reshape(4,3,2)
它可以使用3d - 如果允许使用%s
格式化每个子目录:
In [261]: np.savetxt('test',arr, fmt='%s')
In [262]: cat test
[0 1] [2 3] [4 5]
[6 7] [8 9] [10 11]
[12 13] [14 15] [16 17]
[18 19] [20 21] [22 23]
三维数字格式 - 错误
In [263]: np.savetxt('test',arr, fmt='%d')
....
TypeError: Mismatch between array dtype ('int32') and format specifier ('%d %d %d')
重塑3d到2d - 保存工作:
In [264]: np.savetxt('test',arr.reshape(-1,2), fmt='%d')
In [265]: cat test
0 1
2 3
4 5
6 7
8 9
...
22 23
进行额外的迭代;可以在块之间添加一个空行
In [267]: with open('test','wb') as f:
...: for row in arr:
...: np.savetxt(f, row, '%d',delimiter=', ')
...:
In [268]: cat test
0, 1
2, 3
4, 5
6, 7
...
22, 23
答案 3 :(得分:0)
np.savetxt()的替代方法可能是使用csv模块:
with open("filename.","w+") as my_csv: # writing the file as my_csv
csvWriter = csv.writer(my_csv,delimiter=',') # using the csv module to write the file
csvWriter.writerows(array_2d) # write every row in the matrix
我遇到了与numpy类似的TypeError问题,但CSV方法似乎工作正常。
答案 4 :(得分:0)
如果您希望沿mydata[i,:,:]
处的轴以格式化的行和列的形式写出数据,以产生更具可读性的表格式,请参见以下答案:How to write a multidimensional array to a text file? @JoeKington。我的代码在每个切片的行和列之间添加了一个循环,因为在实现原始代码时找不到TypeError导致的其他任何分辨率:
with open('test.txt', 'w') as outfile:
# Add header giving shape of array
# Any line starting with "#" will be ignored by numpy.loadtxt
outfile.write('# Array shape: {0}\n'.format(x_train.shape))
# Iterating through a ndimensional array produces slices along
# the last axis. This is equivalent to data[i,:,:] in this case
sliceCount = 0
for data_slice in x_train:
# Keep track of the slice numbers
outfile.write('# New slice %d\n'%sliceCount)
# Work through each row and column of the 2d numpy array inside the
# slice, writing each column number to file in format of your choosing
for row in data_slice:
for col in row:
itemStr = "%8.6f,"%col
outfile.write(itemStr)
outfile.write("\n")
sliceCount += 1