2010-10-11 4 views
1

Я создаю 2d сводную матрицу из 3d-массива, используя следующий код:Добавление текстовой заголовки столбцов и строк в Numpy массиву

numTests=len(TestIDs) 
numColumns=11 
numRows=6 
SummaryMeansArray = p.array([]) 
summary3dArray = ma.zeros((numTests,numColumns,numRows)) 

j=0 
for j in range(0,len(TestIDs)): 
    print 'j is: ',j 
    TestID=str(TestIDs[j]) 
    print 'TestID is: ',TestID 
    reader=csv.reader(inputfile) 

    m=1 
    for row in reader: 
     if row[0]!='TestID': 
      summary3dArray[j,1,m] =row[2] 
      summary3dArray[j,2,m] =row[3] 
      summary3dArray[j,3,m] =row[4] 
      summary3dArray[j,4,m] =row[5] 
      summary3dArray[j,5,m] =row[6] 
      summary3dArray[j,6,m] =row[7] 
      summary3dArray[j,7,m] =row[8] 
      summary3dArray[j,8,m] =row[9] 
      summary3dArray[j,9,m] =row[10] 
      summary3dArray[j,10,m] =row[11] 
      m+=1 
    inputfile.close() 
outputfile=open(outputFileName, "wb") 
writer = csv.writer(outputfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) 
outputfile.close() 

smith='test' 

summary3dArray.mask = (summary3dArray.data == 0) # mask all data equal to zero 
summaryMeansArray = mean(summary3dArray, axis=0) # the returned shape is (numColumns,numRows) 
print 'SummaryMeansArray is: ',summaryMeansArray 

данные, возвращаемые печати 2d матрица:

SummaryMeansArray is: [[-- -- -- -- -- --] 
[-- 0.872486111111 0.665114583333 0.578107142857 0.495854166667 0.531722222222] 
[-- 69.6520408802 91.3136933451 106.82865123 125.834593798 112.847127834] 
[-- 1.26883876577 1.64726525154 1.82965948427 1.93913919335 1.81572414167] 
[-- 0.0707222222222 0.0696458333333 0.0654285714286 0.06196875 0.0669444444444] 
[-- 0.219861111055 0.195958333333 0.179925 0.1641875 0.177] 
[-- 0.290583333278 0.265604166667 0.245353571429 0.22615625 0.243944444444] 
[-- 24.1924238322 23.4668576333 23.2784801383 22.8667912971 21.0416383955] 
[-- 90.7234287345 108.496149905 112.364863351 113.57480005 144.061033524] 
[-- 6.16448575902 9.7494285825 11.6270150699 13.5876342704 16.2569218735] 
[-- 0.052665615304 0.069989497088 0.0783212378582 0.0846757181338 0.0862920065249]] 

У меня есть два вопроса:
1.) Я хочу добавить текстовые заголовки строк и заголовки столбцов в summaryMeansArray, но я получаю сообщения об ошибках, когда я пытаюсь сделать это сейчас. Каков правильный синтаксис добавления заголовков строк и заголовков столбцов в этот код?

2.) ли summaryMeansArray настроить иметь 11 столбцов и 6 строк? Я понимаю, что правильный синтаксис - это столбцы, строки. Однако, похоже, он печатает 11 строк и 6 столбцов выше. Это потому, что python группирует данные каждого столбца в своих собственных скобках по соглашению? Или я испортил синтаксис?

ответ

4

1.) Я бы рекомендовал хранить информацию заголовка столбца и строки в отдельной структуре данных. Матрицы Numpy могут хранить смешанные типы данных (в этом случае строки и поплавки), я стараюсь избегать этого. Смешивание типов данных является беспорядочным и кажется мне неэффективным. Если вы захотите, вы можете создать свой собственный класс с данными матрицы и информацией заголовка. Мне кажется, что это чистое решение.

2.) Нет, summaryMeansArray настроен на 11 строк и 6 столбцов. Первым размером матрицы является количество строк. Вы можете получить транспонирование summaryMeansArray с помощью summaryMeansArray.T. Когда вы принимаете среднее значение summary3dArray на 0-й оси, следующая ось становится строками, а вторая - столбцами.

Редактировать: В соответствии с запросом вы можете создать список python из массива numpy с помощью метода tolist(). Например,

newMeansArray = summaryMeansArray.tolist() 

Затем вы можете вставить заголовки столбцов, используя

newMeansArray.insert(0,headers) 

Вставка заголовков строк может быть сделано с:

newMeansArray[i].insert(0,rowheader) 

для каждой строки я. Конечно, если вы уже вставили заголовки столбцов, то подсчет для i начинается с 1, а не 0.

+0

Я понимаю ответ №2 и исправлю это. Но можете ли вы кратко показать мне пример кода для ответа номер 1? Я смотрел видео последнее конечное о создании классов на python, но это все еще нова для меня. – MedicalMath

+0

Могу ли я преобразовать summaryMeansArray в регулярный массив python, а затем добавить строковые значения для столбцов столбцов и строк? какой синтаксис я использую для этого? – MedicalMath

0

Я согласен с ответом Джастина Пила относительно вопроса № 1 (ярлыки строки/заголовка).

Я создал свой собственный класс, который позволяет мне украсить матрицу дополнительными данными, необходимыми для моей задачи под рукой (например: ярлыки строк и столбцов, описательный текст для каждой строки или числовые свойства строки, которые являются внешними независимо от значений матрицы).

Мое первое решение, которое я использовал почти два года, состояло в том, чтобы иметь объект для каждой строки матрицы, где я бы сохранил значения матрицы каждой строки в словаре, причем ключ словаря (ID) предоставил вторую часть информации для это значение матрицы пары. Это было весьма полезно, особенно для неквадратных матриц, а матричные манипуляции и вывод были изолированы чисто.

Однако у меня возникла проблема с этим дизайном: масштабируемость. При использовании квадратных симметричных матриц мне понадобилось 91 МБ памяти для матрицы 1000х1000, 327 МБ памяти для матрицы 2000х2000 и 1900 МБ памяти для матрицы 5000х5000. Для моего недавнего проекта, который работает по заказу матричных записей 20000x20000, я быстро и катастрофически буду использовать все 8 ГБ оперативной памяти моей рабочей станции и многое другое.

Моим вторым решением было иметь один словарь (ID1, ID2) -> сопоставление значений. По сравнению с моим первым решением матрица 1000x1000 требовала только 20 МБ памяти. Это решение также терпит неудачу в отделе масштабируемости, но по-другому, поскольку время создания и хранения отображений C (1000 + 1,2) = 500500 было более 3 минут, по сравнению с 0,88 секунды при использовании моего первого дизайна.

Моим третьим и нынешним решением было создать сопоставление между индексом строки/столбца numpy-матрицы и меткой строки/столбца матрицы. При использовании numpy напрямую с матрицей 5000x5000 требуется 202 Мб памяти в моей системе, матрица 10000x1000 потребовала 774 МБ, а матрица 20000x2000 требовала 3000 МБ. Для сопоставления 20000 идентификаторов индексов строк/столбцов требуется 5 МБ памяти в моей системе, что незначительно по сравнению с самой матрицей значений.

Если вы обрабатываете только малые матрицы размером менее 100x100 элементов, то мое первое решение будет быстрым, и внедренная структура данных будет легко манипулировать и расширять. Однако, если вы думаете о крупномасштабной обработке, я рекомендую третье решение.

+0

Эти требования к памяти для больших матриц используются при использовании 64-разрядного типа с плавающей запятой numpy. Когда матрицы распределяются с использованием dtype = numpy.float32, потребляемая память сокращается наполовину. –

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