Добавление текстовых заголовков столбцов и строк в массив numpy - PullRequest
1 голос
/ 12 октября 2010

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

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

Данные, возвращаемые при печати двумерной матрицы:

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 условно группирует данные каждого столбца в своих скобках?Или я испортил синтаксис?

Ответы [ 2 ]

4 голосов
/ 12 октября 2010

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

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

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

newMeansArray = summaryMeansArray.tolist()

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

newMeansArray.insert(0,headers)

Вставить заголовки строк можно с помощью:

newMeansArray[i].insert(0,rowheader)

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

0 голосов
/ 01 февраля 2012

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

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

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

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

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

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

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

...