code

python numpy.where ()는 어떻게 작동합니까?

codestyles 2020. 9. 8. 07:58
반응형

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 배열에 대한 모든 종류의 논리 연산은 부울 배열을 반환합니다. (즉 __gt__, __lt__등은 모두 주어진 조건이 참인 부울 배열을 반환합니다).

x = np.arange(9).reshape(3,3)
print x > 5

수율 :

array([[False, False, False],
       [False, False, False],
       [ True,  True,  True]], dtype=bool)

이것이 numpy 배열 if x > 5:이면 ValueError를 일으키는 것과 같은 이유 x입니다. 단일 값이 아니라 True / False 값의 배열입니다.

또한 numpy 배열은 부울 배열로 인덱싱 할 수 있습니다. 예를 x[x>5]산출 [6 7 8]이 경우.

솔직히, 실제로 필요한 경우는 매우 드물지만 numpy.where부울 배열이있는 인덱스 만 반환합니다 True. 일반적으로 간단한 부울 인덱싱으로 필요한 작업을 수행 할 수 있습니다.


이전 답변 은 다소 혼란 스럽습니다. 귀하의 진술이 사실 인 위치 (모두)를 제공합니다.

그래서:

>>> 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 ()의 대안으로 사용하지만 다른 용도도 많이 있습니다. 2D 배열과 함께 사용한 적이 없습니다.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

New Answer It seems that the person was asking something more fundamental.

The question was how could YOU implement something that allows a function (such as where) to know what was requested.

First note that calling any of the comparison operators do an interesting thing.

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

This is done by overloading the "__gt__" method. For instance:

>>> class demo(object):
    def __gt__(self, item):
        print item


>>> a = demo()
>>> a > 4
4

As you can see, "a > 4" was valid code.

You can get a full list and documentation of all overloaded functions here: http://docs.python.org/reference/datamodel.html

Something that is incredible is how simple it is to do this. ALL operations in python are done in such a way. Saying a > b is equivalent to a.gt(b)!


np.where returns a tuple of length equal to the dimension of the numpy ndarray on which it is called (in other words ndim) and each item of tuple is a numpy ndarray of indices of all those values in the initial ndarray for which the condition is True. (Please don't confuse dimension with shape)

For example:

x=np.arange(9).reshape(3,3)
print(x)
array([[0, 1, 2],
      [3, 4, 5],
      [6, 7, 8]])
y = np.where(x>4)
print(y)
array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))


y is a tuple of length 2 because x.ndim is 2. The 1st item in tuple contains row numbers of all elements greater than 4 and the 2nd item contains column numbers of all items greater than 4. As you can see, [1,2,2,2] corresponds to row numbers of 5,6,7,8 and [2,0,1,2] corresponds to column numbers of 5,6,7,8 Note that the ndarray is traversed along first dimension(row-wise).

Similarly,

x=np.arange(27).reshape(3,3,3)
np.where(x>4)


will return a tuple of length 3 because x has 3 dimensions.

But wait, there's more to np.where!

when two additional arguments are added to np.where; it will do a replace operation for all those pairwise row-column combinations which are obtained by the above tuple.

x=np.arange(9).reshape(3,3)
y = np.where(x>4, 1, 0)
print(y)
array([[0, 0, 0],
   [0, 0, 1],
   [1, 1, 1]])

참고URL : https://stackoverflow.com/questions/5642457/how-does-python-numpy-where-work

반응형