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)!