Маскированные массивы - PullRequest
5 голосов
/ 17 мая 2011

Как я могу нанести на карту только немаскированные значения MaskedArray?Я думал, что это произойдет автоматически boxplot(ma), но, похоже, это построит блок-маску без маски.

1 Ответ

6 голосов
/ 17 мая 2011

Я думаю, что вы правы - plt.boxplot игнорирует маску, если отправляется массив с маской.Похоже, вам придется оказать boxplot дополнительную помощь, отправив ему только те значения, которые не маскируются.Поскольку каждая строка массива может иметь различное количество немаскированных значений, вы не сможете использовать массив с пустыми значениями.Вам нужно будет сформировать последовательность векторов Python:

z = [[y for y in row if y] for row in x.T]

Например:

import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()

N=20
M=10

x = np.random.random((M,N))
mask=np.random.random_integers(0,1,N*M).reshape((M,N))
x = np.ma.array(x,mask=mask)
ax1=fig.add_subplot(2,1,1)
ax1.boxplot(x)

z = [[y for y in row if y] for row in x.T]
ax2=fig.add_subplot(2,1,2)
ax2.boxplot(z)
plt.show()

enter image description here

Вверху, первый субплот показывает блок-графикиз всех данных в x (игнорируя маску), а на втором вспомогательном участке показан блок-график только тех значений, которые не маскируются.

...