2016-11-13 2 views
0

Я пытаюсь усвоить кучу информации в работоспособный массив как это:Ограничения на списки Python?

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]) 

EDIT: После печати ftada.shape при использовании первых 10 текстовых файлов

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 
+0

Эта ошибка обычно означает, что вы пытаетесь сделать что-то вроде обработки двумерного массива в виде трехмерного массива. Это не связано с количеством элементов в массиве.Я подозреваю, что ваша проблема связана с тем, как вы написали финальную строку, а не что-либо еще в коде. – Ouroborus

+0

Ваш код и исключение не совпадают (в вашем коде нет 'print' или' len'. Это не похоже на то, что вы выполняете код, который, как вы думаете. Возможно, в Anaconda есть проблема с кешем. – Dunes

ответ

2

Похоже fdata является массивом, а ошибка в fdata[:,1,3]. Это пытается индексировать fdata с 3 индексами, срез, 1 и 3. Но если fdata является 2-мерным массивом, это приведет к ошибке: 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') 

Форма и тип массива полностью изменены. Он больше не может создавать однородный 3d-массив из строк.

Форма после 10 файлов (10, 500, 7) означает 10 файлов, по 500 строк каждая, по 7 столбцов каждая строка. Но один файл или более полный 400 отличается. Моя последняя итерация предполагает, что один пуст.

+0

Кажется, что форма массива изменяется с размером? Я этого не понимаю! –

+0

проверьте также тип dtype. Один или несколько ваших файлов имеют разный макет. – hpaulj

+0

похоже, что это просто количество элементов, которые я просматриваю ... –

Смежные вопросы