我有numpy数组,其中可能有heights
。我通过做以下事情来清洁它:
heights = numpy.asarray([ h for h in heights if not numpy.isnan(h) ])
这似乎是表达这种简单/普通事物的一种相当冗长的方式。我经常不得不这样做,以及过滤我的阵列在其他方式,必须回到阵列建设,这是工作,但我打赌有一个更好的方式来做。例如,按范围筛选。。。
heights = numpy.asarray(heights[lowerBound <= heights & heights < upperBound])
在python中失败,因为heights仍然是一个numpy数组。我又回到做。。。
编辑:此行的错误消息为:
类型错误:输入类型不支持ufunc“按位”和“不支持”,并且根据转换规则“安全”,无法安全地将输入强制为任何受支持的类型
/
heights = numpy.asarray(heights[[h for h in heights if lowerBound <= h and h < upperBound]])
太恶心了。我已经使用python 2-3个月了,但是我还没有真正了解如何有效地、简单地使用numpy掩蔽系统。我大量使用matlab,其中的“mask”是一个形状/大小相同的布尔数组。例如。
heights = heights(~isnan(heights));
或者。。。
heights(isnan(heights)) = [];
这两个看起来都非常干净。另外,在python中失败的边界示例在matlab中工作,尽管括号必须改为括号。。。
heights = heights(lowerBound <= heights & heights < upperBound)
如何用python/numpy、pythonic或其他语言编写这些简单的数据转换?
最佳答案
这是有效的:
heights[(10<=heights) & (heights<=90)]
这失败了,错误是真值不明确
heights[10<=heights & heights<=90]
你应该指定错误,而不是说它“失败”。这个错误信息给了我们一些关于它为什么失败的线索。这通常意味着它试图用布尔数组进行一个简单的“if-then”求值,尽管在本例中这是如何发生的并不明显。
10<=heights & heights<=90 # also fails
(10<=heights) & (heights<=90) # fine
heights & heights<=90 # ok
20<=(heights & heights)<=80 # same error
20<=heights<=80 # error
20<=heights[0]<=80 # True
这需要一点挖掘,但现在我认为问题是混合了Python和NuMPY范围评估。Python有一个双面布尔比较,它只对一个值起作用。纽比没有。如果不使用(),它首先执行
heights & heights
并尝试应用单值Python操作,从而导致ambiguous boolean
错误。一般来说,布尔索引或掩蔽在
numpy
中与MATLAB
中一样有效。http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing