我假设我问了一个新手问题,但今天花了太多时间寻找答案。在使用IndexError: too many indices for array
保存和重新加载后,天真地尝试在numpy数组上执行相同的切片操作时,出现np.genfromtxt
错误。
注意:我看到尺寸在重新加载时已经从(3,6)变为(3,)但是无法将结果转换回尺寸(3,6) - 这是我认为必须明显的部分(或者我可能需要以不同的方式指定类型)
yo = np.arange(18)
yo = yo.reshape(3,6)
print(yo)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
print(yo[:,:2])
[[ 0 1]
[ 6 7]
[12 13]]
np.savetxt("test_data.csv", yo, delimiter=",", fmt='%1.4e')
yo_reloaded = np.genfromtxt("test_data.csv", dtype=(float, float, float, float, float, float), delimiter = ",")
#same as above but doesn't work
print(yo_reloaded[:,:2])
IndexError: too many indices for array
print(yo_reloaded)
[( 0., 1., 2., 3., 4., 5.) ( 6., 7., 8., 9., 10., 11.)
( 12., 13., 14., 15., 16., 17.)]
# shape changed
print(yo_reloaded.shape)
(3,)
答案 0 :(得分:1)
使用dtype=None
告诉genfromtxt
尝试智能猜测dtype
。在这种情况下,由于所有值都是浮点数,genfromtxt
将为数组指定一个浮点dtype:
In [19]: yo_reloaded = np.genfromtxt("test_data.csv", dtype=None, delimiter = ",")
In [21]: yo_reloaded.dtype
Out[21]: dtype('float64')
和yo_reload
的形状为(3,6)
。
相反,如果您设置dtype=(float, float, float, float, float, float)
:
yo_reloaded = np.genfromtxt("test_data.csv", dtype=(float, float, float, float, float, float), delimiter = ",")
然后yo_reloaded.dtype
变为:
In [18]: yo_reloaded.dtype
Out[18]: dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8')])
是structured array的dtype。结构化数组的形状为(3,)
变为NumPy视图,该数组由3行组成,每行具有由6个浮点dtype字段组成的单个值。这根本不是你想要的,而是当你将dtype
设置为等于类型元组时所得到的。
请注意,您还可以使用dtype=float
获取所需的数组:
In [24]: yo_reloaded = np.genfromtxt("test_data.csv", dtype=float, delimiter = ",")
In [25]: yo_reloaded.shape
Out[25]: (3, 6)
In [26]: yo_reloaded.dtype
Out[26]: dtype('float64')
或者,作为hpaulj points out,您可以完全省略dtype
参数,在这种情况下,它默认为dtype=float
。
答案 1 :(得分:1)
如果您在print(yo_reloaded.shape)
之前运行print(yo_reloaded[:,:2])
,则可以看到您的np.genfromtxt()
调用返回(3,)
,这意味着包含一列数据的3行。
当您使用dtype=(float, float, float, float, float, float)
时,您正在映射"test_data.csv"
5元组中的每一行。所以np.genfromtxt()
将每一行作为5元组元素返回。
要获得相同的结果,您必须将dtype=dtype=(float, float, float, float, float, float)
更改为dtype=float
。