切片数组的IndexError

时间:2018-04-01 20:10:11

标签: python numpy slice

我假设我问了一个新手问题,但今天花了太多时间寻找答案。在使用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,)

2 个答案:

答案 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