Python列表的限制?

时间:2016-11-13 07:31:29

标签: python list numpy

我试图将一堆信息同化为一个可用的数组,如下所示:

for (dirpath, dirnames, filenames) in walk('E:/Machin Lerning/Econ/full_set'):
    ndata.extend(filenames)
for i in ndata:
    currfile = open('E:/Machin Lerning/Econ/full_set/' + str(i),'r')
    rawdata.append(currfile.read().splitlines())
    currfile.close()
rawdata = numpy.array(rawdata)

for order,file in enumerate(rawdata[:10]):
    for i in rawdata[order]:
        r = i.split(',')
        pdata.append(r)
    fdata.append(pdata)
    pdata = []
fdata = numpy.array(fdata)
plt.figure(1)
plt.plot(fdata[:,1,3])

编辑:使用前10个txt文件后打印ftada.shape

for order,file in enumerate(rawdata[:10]):

我看到它是(10,500,7)。但如果我不限制这个的大小,而是说

for order,file in enumerate(rawdata):

然后fdata.shape就是(447,) 似乎每当我将rawdata数组中的元素数量增加到13以上时就会发生这种情况...它也不是任何特定位置 - 我将其更改为

for order,file in enumerate(rawdata[11:24):

并且工作正常。 aaaaahhh 如果它有用:这里是文本文件的样本:

20080225,A,31.42,31.79,31.2,31.5,30575  
20080225,AA,36.64,38.95,36.48,38.85,225008  
20080225,AAPL,118.59,120.17,116.664,119.74,448847  

1 个答案:

答案 0 :(得分:2)

看起来fdata是一个数组,错误在fdata[:,1,3]。这会尝试使用3个索引(切片,1和3)对fdata进行索引。但如果fdata是2d数组,则会产生此错误 - too many indices

当您获得“索引”时错误,找出有问题的数组的shape。不要猜。添加调试语句print(fdata.shape)

===================

将您的文件样本作为行列表:

In [822]: txt=b"""20080225,A,31.42,31.79,31.2,31.5,30575  
     ...: 20080225,AA,36.64,38.95,36.48,38.85,225008  
     ...: 20080225,AAPL,118.59,120.17,116.664,119.74,448847 """
In [823]: txt=txt.splitlines()

In [826]: fdata=[]
In [827]: pdata=[]

阅读一个文件':

In [828]: for i in txt:
     ...:     r=i.split(b',')
     ...:     pdata.append(r)
     ...: fdata.append(pdata)
     ...: 
     ...:     
In [829]: fdata
Out[829]: 
[[[b'20080225', b'A', b'31.42', b'31.79', b'31.2', b'31.5', b'30575  '],
  ....]]]
In [830]: np.array(fdata)
Out[830]: 
array([[[b'20080225', b'A', b'31.42', b'31.79', b'31.2', b'31.5',
         b'30575  '],
...]]], 
      dtype='|S8')
In [831]: _.shape
Out[831]: (1, 3, 7)

阅读相同的文件"

In [832]: for i in txt:
     ...:     r=i.split(b',')
     ...:     pdata.append(r)
     ...: fdata.append(pdata)

In [833]: len(fdata)
Out[833]: 2
In [834]: np.array(fdata).shape
Out[834]: (2, 6, 7)
In [835]: np.array(fdata).dtype
Out[835]: dtype('S8')

注意dtype - 一个包含8个字符的字符串。由于每行的值是一个字符串,它不能将整个事物转换为数字。

现在阅读略有不同的文件' (少一行,少一行)

In [836]: txt1=b"""20080225,A,31.42,31.79,31.2,31.5,30575  
     ...: 20080225,AA,36.64,38.95,36.48,38.85 """
In [837]: txt1=txt1.splitlines()
In [838]: for i in txt1:
     ...:     r=i.split(b',')
     ...:     pdata.append(r)
     ...: fdata.append(pdata)

In [839]: len(fdata)
Out[839]: 3
In [840]: np.array(fdata).shape
Out[840]: (3, 8)
In [841]: np.array(fdata).dtype
Out[841]: dtype('O')

现在让我们添加一个空的'文件 - 没有行,因此pdata[]

In [842]: fdata.append([])
In [843]: np.array(fdata).shape
Out[843]: (4,)
In [844]: np.array(fdata).dtype
Out[844]: dtype('O')

数组形状和dtype完全改变了。它不能再从行创建一个统一的3d数组。

10个文件后的形状(10,500,7)表示10个文件,每行500行,每行7列。但是400个文件中的一个或多个文件是不同的。我的最后一次迭代表明一个是空的。