将文本列和行标题添加到numpy数组

时间:2010-10-11 21:49:18

标签: arrays text numpy cell

我使用以下代码从3d数组创建二维摘要矩阵:

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按照惯例将每个列的数据分组在自己的括号中吗?或者我搞砸了语法?

2 个答案:

答案 0 :(得分:4)

1。)我建议将列和行标题信息存储在单独的数据结构中。 Numpy矩阵可以存储混合数据类型(在这种情况下是字符串和浮点数),我尽量避免它。混合数据类型很混乱,对我来说似乎效率低下。如果您愿意,可以使用矩阵数据和标题信息创建自己的类。对我来说这似乎是一个更清洁的解决方案。

2。)不,summaryMeansArray设置为包含11行和6列。矩阵的第一个维度是行数。您可以使用summaryMeansArray.T获取summaryMeansArray的转置。当您在第0轴上获取summary3dArray的平均值时,下一个轴将成为行,而后一个轴将成为列。

编辑:根据请求,您可以使用方法tolist()从numpy数组创建python列表。例如,

newMeansArray = summaryMeansArray.tolist()

然后您可以使用

插入列标题
newMeansArray.insert(0,headers)

插入行标题可以通过以下方式完成:

newMeansArray[i].insert(0,rowheader)

每行i。当然,如果你已经插入了列标题,那么i的计数从1开始而不是0。

答案 1 :(得分:0)

我同意Justin Peel关于问题#1(行/标题标签)的回答。

我创建了自己的类,允许我用我手头的任务所需的额外数据来装饰矩阵(例如:行和列标签,每行的描述性文本,或外部行的数字属性)或独立于矩阵值。)

我使用了近2年的第一个解决方案是为每个矩阵行创建一个对象,我将每行的矩阵值存储在字典中,字典键(ID)为其​​提供第二条信息。对的矩阵值。这非常有用,特别是对于非方形矩阵,矩阵操作和输出被完全隔离。

但是,我遇到了这个设计的问题:可扩展性。 当使用方形对称矩阵时,我需要91 MB内存用于1000x1000矩阵,327 MB内存用于2000x2000矩阵,1900 MB内存用于5000x5000矩阵。 对于我最近的20000x20000矩阵条目顺序的项目,我将快速而灾难性地耗尽我所有工作站的8GB RAM等等。

我的第二个解决方案是拥有一个(ID1,ID2) - >值映射的字典。 与我的第一个解决方案相比,1000x1000矩阵只需要20 MB的内存。 此解决方案在可伸缩性部门中也失败了,但是以不同的方式,因为创建和存储C(1000 + 1,2)= 500500映射的时间超过3分钟,而使用我的第一个设计时为0.88秒。 / p>

我的第三个当前解决方案是在numpy矩阵行/列索引和矩阵行/列标签之间创建映射。使用numpy直接使用5000x5000矩阵在我的系统上需要202 MB内存,10000x1000矩阵需要774 MB,20000x2000矩阵需要3000 MB。 20000个ID到行/列索引的映射需要我系统上5 MB的内存,与值矩阵本身相比可以忽略不计。

如果只处理小于100x100元素的小矩阵,那么我的第一个解决方案将很快,并且实现的数据结构将易于操作和扩展。但是,如果您正在考虑进行大规模处理,那么我建议采用第三种解决方案。