programing

주어진 조건에서 배열의 요소를 선택하려면 어떻게 해야 합니까?

testmans 2023. 6. 14. 21:44
반응형

주어진 조건에서 배열의 요소를 선택하려면 어떻게 해야 합니까?

내가 바보 같은 배열을 가지고 있다고 가정해 보세요.x = [5, 2, 3, 1, 4, 5],y = ['f', 'o', 'o', 'b', 'a', 'r']다음에서 요소를 선택합니다.y의 요소에 해당하는x1보다 크고 5보다 작은 것.

나는 노력했다.

x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']

하지만 이것은 효과가 없습니다.어떻게 해야 하나요?

괄호를 추가하면 식을 사용할 수 있습니다.

>>> y[(1 < x) & (x < 5)]
array(['o', 'o', 'a'], 
      dtype='|S1')

IMOOP는 실제로 (일명 )를 원하는 것이 아니라 다음과 같은 논리적 값을 비교하고 있기 때문에 실제로 원합니다.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')

이를 위한 동등한 방법은 다음을 설정하는 것입니다.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거의 비슷합니다.

@J.F에 하나의 세부사항을 추가합니다.세바스찬과 마크 미코프스키의 대답:
배열의 실제 값이 아닌 해당 인덱스를 가져오려면 다음 코드를 사용하면 됩니다.

여러 (모든) 조건을 충족하는 경우:

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

나는 사용하기를 좋아합니다.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')

장점은 벡터화된 함수에 더 많은 유형의 제약 조건을 추가할 수 있다는 것입니다.

도움이 되길 바랍니다.

사실 저는 다음과 같은 방식으로 할 것입니다.

L1은 조건 1을 만족하는 요소의 색인 목록입니다. (아마도 사용할 수 있을 것입니다.)somelist.index(condition1)또는np.where(condition1)L1을 얻기 위해.)

마찬가지로 조건 2를 만족하는 원소 목록인 L2를 얻을 수 있습니다.

그런 다음 다음 다음을 사용하여 교차로를 찾습니다.intersect(L1,L2).

또한 여러 조건을 충족하는 경우 여러 리스트의 교차점을 찾을 수 있습니다.

그런 다음 x와 같은 다른 배열에 인덱스를 적용할 수 있습니다.

2D 어레이의 경우 이 작업을 수행할 수 있습니다.조건을 사용하여 2D 마스크를 만듭니다.배열에 따라 내부 또는 플로팅할 조건 마스크를 입력하고 원래 배열과 곱합니다.

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.]])

언급URL : https://stackoverflow.com/questions/3030480/how-do-i-select-elements-of-an-array-given-condition

반응형