답변:
괄호를 추가하면 표현식이 작동합니다.
>>> y[(1 < x) & (x < 5)]
array(['o', 'o', 'a'],
dtype='|S1')
&
는 <
and 보다 우선 순위가 높으며 >
, 이는 (logical)보다 우선 순위가 높습니다 and
. x > 1 and x < 5
불평등을 먼저 완화 한 다음 논리적 연결을 제거합니다. x > 1 & x < 5
비트 단위의 결합을 평가 1
하고 (의 값) x
이어서, 부등식. (x > 1) & (x < 5)
불평등이 먼저 평가되도록하여 모든 연산이 의도 한 순서대로 발생하고 결과가 모두 명확하게 정의됩니다. 여기 문서를 참조하십시오.
(0 < x) & (x < 10)
대신 (답변에 표시된대로) 작성해야합니다 0 < x < 10
.
IMO 영업 이익은 실제로 원하지 않는다 np.bitwise_and()
(일명 &
) 실제로 원하는 np.logical_and()
그들과 같은 논리 값 비교되기 때문에 True
와 False
-에 SO 게시물을 참조 비트 대 논리적 차이를 볼 수 있습니다.
>>> x = array([5, 2, 3, 1, 4, 5])
>>> y = array(['f','o','o','b','a','r'])
>>> output = y[np.logical_and(x > 1, x < 5)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
이와 동등한 방법 np.all()
은 axis
인수를 적절하게 설정하는 것 입니다.
>>> output = y[np.all([x > 1, x < 5], axis=0)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
숫자로 :
>>> %timeit (a < b) & (b < c)
The slowest run took 32.97 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 1.15 µs per loop
>>> %timeit np.logical_and(a < b, b < c)
The slowest run took 32.59 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.17 µs per loop
>>> %timeit np.all([a < b, b < c], 0)
The slowest run took 67.47 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.06 µs per loop
그래서 사용은 np.all()
느리지 만 &
과 logical_and
거의 동일하다.
output = y[np.logical_and(x > 1, x < 5)]
에서 평가됩니다 (거대한 배열을 생성 할 수 있음). IOW 는 이미 평가 된 두 개의 인수를 전달받습니다. 이것은 일반적인 경우와 다르며 , 사실과 같은지 평가되지 않습니다 . x < 5
logical_and
a and b
b
a
@JF Sebastian과 @Mark Mikofski의 답변에 세부 사항을 추가하십시오 :
실제 배열 값이 아닌 해당 인덱스를 얻으려면 다음 코드가 수행됩니다.
여러 (모든) 조건을 만족시키는 경우 :
select_indices = np.where( np.logical_and( x > 1, x < 5) )[0] # 1 < x <5
여러 조건을 만족시키는 경우 :
select_indices = np.where( np.logical_or( x < 1, x > 5 ) )[0] # x <1 or x >5
(the array of indices you want,)
, 당신은해야합니다, 그래서 select_indices = np.where(...)[0]
당신이 원하는 결과를 얻을 수 그리고 기대하십시오.
나는 np.vectorize
그러한 작업 에 사용 하고 싶습니다 . 다음을 고려하세요:
>>> # Arrays
>>> x = np.array([5, 2, 3, 1, 4, 5])
>>> y = np.array(['f','o','o','b','a','r'])
>>> # Function containing the constraints
>>> func = np.vectorize(lambda t: t>1 and t<5)
>>> # Call function on x
>>> y[func(x)]
>>> array(['o', 'o', 'a'], dtype='<U1')
벡터화 된 함수에 더 많은 유형의 구속 조건을 추가 할 수 있다는 장점이 있습니다.
도움이 되길 바랍니다.
2D 배열의 경우이 작업을 수행 할 수 있습니다. 조건을 사용하여 2D 마스크를 만듭니다. 배열에 따라 조건 마스크를 int 또는 float로 typecast하고 원래 배열과 곱하십시오.
In [8]: arr
Out[8]:
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.]])
In [9]: arr*(arr % 2 == 0).astype(np.int)
Out[9]:
array([[ 0., 2., 0., 4., 0.],
[ 6., 0., 8., 0., 10.]])