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
'code' 카테고리의 다른 글
JQuery에 권장되는 JavaScript HTML 템플릿 라이브러리? (0) | 2020.09.08 |
---|---|
간헐적 인 asp.net mvc 예외 : "공개 작업 방법 ABC를 컨트롤러 XYZ에서 찾을 수 없습니다." (0) | 2020.09.08 |
slf4j에서 런타임시 메시지의 로그 수준 설정 (0) | 2020.09.08 |
WPF에서 탭 순서 설정 (0) | 2020.09.07 |
로그에 Spring 트랜잭션 표시 (0) | 2020.09.07 |