开发者

calculating mean of several numpy masked arrays (masked_all)

开发者 https://www.devze.com 2023-03-30 20:49 出处:网络
first of all I\'m new to python and programming but you guys already helped me a lot, so thanks a lot! But I\'ve come to a problem I haven\'t found an answer so far:

first of all I'm new to python and programming but you guys already helped me a lot, so thanks a lot! But I've come to a problem I haven't found an answer so far:

I have the data of several plates where the data represents the pressure on each plate at a large number of different spots. The thing is, these plates aren't perfectly round because of the sensors measuring the pressure and sometimes these sensors even produce an error so I don't have any data at a spot within the plate.

When I just have to plot one plate, I'll do it like that:

import numpy.ma as ma    

matrix=ma.masked_all((160,65),float)
for x in range(len(plate.X)):
    matrix[(plate.Y[x],plate.X[x])]=data.index(plate.measurementname[x])
image.pcolormesh(matrix,min,max)

This works fine开发者_运维技巧. Now that I have several plates I'd like to plot the mean pressure on each spot. Because I don't know any mean function, I thought of adding all plates together and divide by the number of plates...I tried following:

import numpy.ma as ma    

meanmatrix=ma.masked_all((160,65),float)
for plate in plateslist:
    matrix=ma.masked_all((160,65),float)
    for x in range(len(plate.X)):
        matrix[(plate.Y[x],plate.X[x])]=data.index(plate.measurementname[x])
    meanmatrix+=matrix
meanmatrix=meanmatrix/len(plateslist)
image.pcolormesh(meanmatrix,min,max)

This works pretty good but there's one problem I can't solve. As I said sometimes some plates didn't get all data, therefore there's a "hole" at some spots in the plot. Now my meanmatrix has a whole where ever one of the plates had a whole even if all others had data at that spot.

How can I make sure I won't get these holes or is there even a smoother way of getting my "meanmatrix"?? (I hope my question is clear enough...)

Edit:

The problem is not that I don't get the mean of the data, this actually works (well I don't like how I did it but it works), the problem is that I get these "holes" I described before. That's what bothers me.


EDIT: Sorry, I misinterpreted the question. Try this:

allplates = ma.masked_all((160, 65, numplates))
# fill in allplates
meanplate = allplates.mean(axis=2)

This will compute the mean over the last dimension of the array, i.e., average the plates together. Missing values are ignored.


Earlier answer: You can take the mean of a masked array, and it will ignore the missing values:

>>> X = ma.masked_all((160, 65))
>>> X.mean()
masked
>>> X[0, 0] = 1
>>> X.mean()
1.0

Try to avoid using matrix as a variable name, though, because it also refers to a NumPy data structure.


Ok I got an answer:

import numpy.ma as ma    

allplats=ma.masked_all((160,65),float)
for plate in plateslist:
    for x in range(len(plate.X)):
        allplates[(plate.Y[x],plate.X[x])]+=data.index(plate.measurementname[x])
allplates=allplates/len(plateslist)
image.pcolormesh(meanmatrix,min,max)

This actually works! So i guess there was a mistake when adding two masked_all arrays...("Stupid is as stupid does") If someone has a better approach to get the mean of all plates at each single spot, it would be nice to read it.

0

精彩评论

暂无评论...
验证码 换一张
取 消