2011-05-08 228 views
14

我有一个rank-1 numpy.array我想制作boxplot。但是,我想排除数组中的所有值等于零......目前,我通过循环数组并将该值复制到新数组(如果不等于零)来解决此问题。然而,由于阵列包含86 000 000个值,我必须多次这样做,这需要很多耐心。从numpy.array中删除数据

有没有更聪明的方法来做到这一点?

回答

11

这就是你要使用屏蔽阵列的情况下,它让你的阵列的形状,它是由所有numpy的和matplotlib功能自动识别。

X = np.random.randn(1e3, 5) 
X[np.abs(X)< .1]= 0 # some zeros 
X = np.ma.masked_equal(X,0) 
plt.boxplot(X) #masked values are not plotted 

#other functionalities of masked arrays 
X.compressed() # get normal array with masked values removed 
X.mask # get a boolean array of the mask 
X.mean() # it automatically discards masked values 
+0

link to documentation:http://docs.scipy.org/doc/numpy/reference/routines.ma.html – 2011-05-10 21:51:25

27

对于NumPy的阵列a,可以使用

a[a != 0] 

提取不等于零的值。

+0

非常感谢你,这个工作确实很多( !) 更多更快。类似的行为可以在更高等级的NumMpy阵列或矩阵上完成吗?因为在这里,问题发生,尺寸不再适当地匹配...... – 2011-05-08 12:07:49

+0

@rubae:如果'a'具有更高的维数,结果将是一个扁平(一维)数组。也可以删除全部为零的列或行。 – 2011-05-08 12:51:04

2

我想建议你对这种情况简单地使用NaN,你会忽略一些值,但仍然希望保持统计过程尽可能有意义。所以

In []: X= randn(1e3, 5) 
In []: X[abs(X)< .1]= NaN 
In []: isnan(X).sum(0) 
Out[: array([82, 84, 71, 81, 73]) 
In []: boxplot(X) 

enter image description here

+0

啊,这里使用NaN确实比较合适,谢谢。因此,我不再需要将我的数据复制到具有不同大小的新数组,但我可以保留原始数组并将其作为数组中的位置。谢谢 ! – 2011-05-08 17:10:28

+0

你也许知道一种方式来循环使用列表理解?也就是说我有一个字典'a',其中'[k]'是一个NumPy数组,因此我想做'[a [k] [abs(a [k])<。1] = float('NaN' )for k in data]'但这似乎在循环中失败,而只在循环中执行命令似乎工作... – 2011-05-08 17:29:35

+0

@rubae:我认为你应该提出一个与这个列表理解问题有关的单独问题。不幸的是,它不再那么直截了当地弄清楚你实际上瞄准的是什么:(就我所能猜到的而言,不要被列表理解所迷惑,也许你只是在寻找像这样简单的东西:'for k in data:a [k] [abs(a [k])<.1] = NaN'? – eat 2011-05-08 19:22:39

0

一个简单的代码行可以帮你排除所有的 '0' 值的数组:

np.argwhere(*array*) 

例如:

import numpy as np 
array = [0, 1, 0, 3, 4, 5, 0] 
array2 = np.argwhere(array) 
print array2 

[1, 3, 4, 5]