python numpy.where()如何工作?
我正在玩弄numpy
,通过文档挖掘,我遇到了一些魔法。 也就是说我在谈论numpy.where()
:
>>> x = np.arange(9.).reshape(3, 3) >>> np.where( x > 5 ) (array([2, 2, 2]), array([0, 1, 2]))
他们如何实现内部的,你可以传递一个像x > 5
的方法? 我想这与__gt__
但我正在寻找一个详细的解释。
他们如何实现内部的,你可以传递一个像x> 5的方法?
简短的回答是,他们不。
numpy数组上的任何types的逻辑操作都会返回一个布尔数组。 (即__gt__
, __lt__
等全部返回布尔数组,其中给定的条件为真)。
例如
x = np.arange(9).reshape(3,3) print x > 5
收益率:
array([[False, False, False], [False, False, False], [ True, True, True]], dtype=bool)
这就是为什么类似于if x > 5:
如果x
是一个numpy数组,则会引发ValueError。 这是一个True / False值的数组,而不是一个单一的值。
此外,numpy数组可以通过布尔数组进行索引。 例如,在这种情况下, x[x>5]
产生[6 7 8]
。
老实说,你实际上需要numpy.where
但它只是返回一个布尔数组为True
numpy.where
。 通常你可以用简单的布尔索引来做你所需要的。
老答案是有点混淆。 它给你的位置(所有这些)你的陈述是真实的。
所以:
>>> a = np.arange(100) >>> np.where(a > 30) (array([31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]),) >>> np.where(a == 90) (array([90]),) a = a*40 >>> np.where(a > 1000) (array([26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]),) >>> a[25] 1000 >>> a[26] 1040
我使用它作为list.index()的替代,但它也有很多其他用途。 我从来没有用过二维数组。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
新的答案看来,这个人正在问一些更基本的东西。
问题是你怎么能够实现一个允许一个函数(比如where)知道要求的东西。
首先请注意,调用任何比较运算符都会引起一些有趣的事情。
a > 1000 array([False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True`, True, True, True, True, True, True, True, True, True], dtype=bool)`
这是通过重载“__gt__”方法来完成的。 例如:
>>> class demo(object): def __gt__(self, item): print item >>> a = demo() >>> a > 4 4
正如你所看到的,“a> 4”是有效的代码。
您可以在这里获得所有重载函数的完整列表和文档: http : //docs.python.org/reference/datamodel.html
不可思议的事情是这么做的简单。 在Python中的所有操作都是以这种方式完成的。 说a> b等于a。 gt (b)!