3D Numpy 배열 목록이 있고이 구조의 각 요소를 반복하고 if statemets로 약간 변경하고 싶습니다. 아래 코드는 내가 원하는 작업을 수행합니다.
for counter1, entry in enumerate(all_frames_flow):
for counter2, entry2 in enumerate(entry):
for counter3, entry3 in enumerate(entry2):
for counter4, entry4 in enumerate(entry3):
if entry4 < -20.0:
all_frames_flow[counter1][counter2][counter3][counter4]=-20.0
if entry4 > 20.0:
all_frames_flow[counter1][counter2][counter3][counter4]=20.0
all_frames_flow[counter1][counter2][counter3][counter4]/=20
그러나 더 비단뱀적인 방법이 있는지 궁금합니다. 에서 numpy >=1.15.0
나는 문서에서이 새로운 코드를 시도했지만 실패, 그것이 내가 원하는 결과를 다시 제공하지 않습니다, 나는보다 큰 값을 볼 수있는 abs(20)
것을 왜 궁금해 :
for counteref, _ in enumerate(backup2):
with np.nditer(backup2[counteref], op_flags=['readwrite'], order = 'K') as it:
for x in it:
#print x
if (x < -20.0):
x=-20.0
if (x > 20.0):
x = 20.0
x/=20.0
더 나은 / 대체 반복자를 시도하기 전에 반복없이 작업을 수행해야합니다 (즉, 컴파일 된 numpy
코드로 작업 수행 ).
In [347]: arr = np.random.randint(-40,40,(2,3,4))
예를 들어 다음과 같은 clip
방법이 있습니다.
In [348]: arr.clip(-20, 20)
Out[348]:
array([[[-20, -20, 20, -6],
[-15, -17, -8, -20],
[ 2, -20, -16, 20]],
[[-20, 3, -20, 17],
[ 20, 20, 20, -17],
[ 11, -20, 20, 0]]])
모든 것을 20으로 나누는 것은 간단합니다 numpy
.
In [349]: _/20
Out[349]:
array([[[-1. , -1. , 1. , -0.3 ],
[-0.75, -0.85, -0.4 , -1. ],
[ 0.1 , -1. , -0.8 , 1. ]],
[[-1. , 0.15, -1. , 0.85],
[ 1. , 1. , 1. , -0.85],
[ 0.55, -1. , 1. , 0. ]]])
더 나은 방법은 부울 마스킹으로 이런 종류의 작업을 수행하는 것입니다.
In [351]: arr
Out[351]:
array([[[-32, -30, 39, -6],
[-15, -17, -8, -34],
[ 2, -31, -16, 35]],
[[-39, 3, -37, 17],
[ 31, 30, 28, -17],
[ 11, -24, 26, 0]]])
In [354]: mask1 = arr<-20
In [355]: mask2 = arr>20
In [356]: mask1
Out[356]:
array([[[ True, True, False, False],
[False, False, False, True],
[False, True, False, False]],
[[ True, False, True, False],
[False, False, False, False],
[False, True, False, False]]])
In [357]: mask2
Out[357]:
array([[[False, False, True, False],
[False, False, False, False],
[False, False, False, True]],
[[False, False, False, False],
[ True, True, True, False],
[False, False, True, False]]])
In [358]: arr[mask1]=-20
In [359]: arr[mask2]=20
In [360]: arr
Out[360]:
array([[[-20, -20, 20, -6],
[-15, -17, -8, -20],
[ 2, -20, -16, 20]],
[[-20, 3, -20, 17],
[ 20, 20, 20, -17],
[ 11, -20, 20, 0]]])
반복에 관해서는 모든 Python 반복에서 사용할 수 없음을 기억하는 것이 중요합니다.
x의 경우 ... : x = -20.0
소스를 수정합니다. 이 x=...
할당은 x
변수에 새 값을 할당 하고 반복과의 연결을 끊습니다. 이유를 모르겠다면 간단한 목록으로 시도해보십시오. 그 자리에서 변수를 변경해야합니다. 경우 x
수 없습니다 간단한 정수입니다.
첫 번째 반복에서는 인덱싱하고 변경 all_frames_flow
하므로 작동합니다.
all_frames_flow [counter1] [counter2, counter3, counter4] =-20.0
nditer
변경 가능한 반복 변수를 제공하므로 다음을 수행 할 수 있습니다.
In [364]: with np.nditer(arr, op_flags=['readwrite'], order = 'K') as it:
...: for x in it:
...: #print x
...: if (x < -20.0):
...: x[...]=-20.0 # change x in-place
...: if (x > 20.0):
...: x[...] = 20.0
...:
nditer
값을 변경하는 모든 예는이 [...]=
표기법을 사용해야합니다 .
nditer
적어도 Python 코드 는 사용하지 않는 것이 좋습니다 . Python 코드에서는 자체 컴파일 된 코드 (사용 cython
) 에서 구현 될 아이디어를 테스트하는 방법으로 가장 유용합니다 . 속도 이점은 제공하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다