주어진 조건에서 배열의 요소를 선택하려면 어떻게 해야 합니까?
내가 바보 같은 배열을 가지고 있다고 가정해 보세요.x = [5, 2, 3, 1, 4, 5]
,y = ['f', 'o', 'o', 'b', 'a', 'r']
다음에서 요소를 선택합니다.y
의 요소에 해당하는x
1보다 크고 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
'programing' 카테고리의 다른 글
날짜 스탬프로 현재 Excel 워크북을 저장하고 vba 코드로 "다른 이름으로 저장"하는 방법은 무엇입니까? (0) | 2023.06.14 |
---|---|
C#의 StringBuilder와 같은 Python 문자열 클래스? (0) | 2023.06.14 |
루비 형식으로 xlsx 파일 가져오기/내보내기를 지원하는 보석 (0) | 2023.06.14 |
제공한 권한 부여 메커니즘이 지원되지 않습니다.AWS4-HMAC-SHA256을 사용하십시오. (0) | 2023.06.14 |
그룹별 첫 번째 행 선택 (0) | 2023.06.14 |