@Value("\${어쩌구저쩌구}")
'Program > JAVA' 카테고리의 다른 글
@TestInstance (0) | 2023.10.27 |
---|
Dataframe shift (0) | 2022.12.23 |
---|---|
graphviz 설치 후 오류 (Anaconda) (0) | 2018.08.10 |
ubuntu Jupyter (0) | 2018.07.13 |
numpy axis (0) | 2018.07.13 |
docker 한글설정 (0) | 2018.07.07 |
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
테스트 인스턴스 단위를 클래스로 설정하자.
테스트는 메소드 단위이기에...
io.jsonwebtoken.io.DecodingException: Illegal base64 character: '.' (0) | 2024.01.31 |
---|
Pandas의 shift method는 DataFrame이나 Series에 적용해서 행의 위치를 일정 칸수씩 이동시킵니다.
바로 예시를 통해 알아봅시다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
7, 8, 9, 10,
11, 12, 13,
14, 15, 16
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_shifted = df_test.shift(-1)
print(df_shifted)
print(type(df_shifted))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 7
7 2 a 2050 8
8 2 b 2000 9
9 2 b 2200 10
10 3 a 3000 11
11 3 a 3100 12
12 3 b 3200 13
13 4 a 4200 14
14 4 b 4100 15
15 4 b 4150 16
col1 col2 col3 col4
0 1.0 a 1100.0 2.0
1 1.0 a 1200.0 3.0
2 1.0 b 1300.0 4.0
3 1.0 b 1050.0 5.0
4 1.0 b 1100.0 6.0
5 2.0 a 2100.0 7.0
6 2.0 a 2050.0 8.0
7 2.0 b 2000.0 9.0
8 2.0 b 2200.0 10.0
9 3.0 a 3000.0 11.0
10 3.0 a 3100.0 12.0
11 3.0 b 3200.0 13.0
12 4.0 a 4200.0 14.0
13 4.0 b 4100.0 15.0
14 4.0 b 4150.0 16.0
15 NaN NaN NaN NaN
<class 'pandas.core.frame.DataFrame'>
위 예시는 df_test라는 DataFrame을 생성한 후 이 DataFrame에 shift를 적용한 것입니다.
df_shifted를 보면 DataFrame의 모든 행의 값이 하나씩 위로 올라간걸 볼 수 있습니다.
하나씩 위로 올라간것은 shift의 인자로서 -1이 적혔기 때문이고, -1은 위쪽으로 한칸씩 옮기라는 뜻입니다.
현재 index보다 1씩 작은(-1) index의 위치로 옮기라는 것입니다.
그리고 index=15인 행은 다음 행이 없으니 NaN값으로 표시된 것을 알 수 있죠.
또한 shift가 적용된 대상이 DataFrame인 df_test이므로 return되는 데이터도 DataFrame입니다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
7, 8, 9, 10,
11, 12, 13,
14, 15, 16
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_shifted = df_test.shift(1)
print(df_shifted)
print(type(df_shifted))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 7
7 2 a 2050 8
8 2 b 2000 9
9 2 b 2200 10
10 3 a 3000 11
11 3 a 3100 12
12 3 b 3200 13
13 4 a 4200 14
14 4 b 4100 15
15 4 b 4150 16
col1 col2 col3 col4
0 NaN NaN NaN NaN
1 1.0 a 1000.0 1.0
2 1.0 a 1100.0 2.0
3 1.0 a 1200.0 3.0
4 1.0 b 1300.0 4.0
5 1.0 b 1050.0 5.0
6 1.0 b 1100.0 6.0
7 2.0 a 2100.0 7.0
8 2.0 a 2050.0 8.0
9 2.0 b 2000.0 9.0
10 2.0 b 2200.0 10.0
11 3.0 a 3000.0 11.0
12 3.0 a 3100.0 12.0
13 3.0 b 3200.0 13.0
14 4.0 a 4200.0 14.0
15 4.0 b 4100.0 15.0
<class 'pandas.core.frame.DataFrame'>
반면에 shift의 인자로 1을 전달하면 모든 행의 값이 아래쪽으로 1칸씩 밀린 것을 알 수 있습니다.
index=0인 행은 이전 행이 없으므로 NaN으로 표시되었습니다.
이렇게 몇 칸을 옮기고싶은지에 대한 숫자를 shift의 인자로서 전달하면 원하는 만큼 이동이 가능합니다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
6, 7, 8, 9,
10, 11, 12,
13, 14, 15
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_shifted = df_test.loc[:, 'col4'].shift(-1)
print(df_shifted)
print(type(df_shifted))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 6
7 2 a 2050 7
8 2 b 2000 8
9 2 b 2200 9
10 3 a 3000 10
11 3 a 3100 11
12 3 b 3200 12
13 4 a 4200 13
14 4 b 4100 14
15 4 b 4150 15
0 2.0
1 3.0
2 4.0
3 5.0
4 6.0
5 6.0
6 7.0
7 8.0
8 9.0
9 10.0
10 11.0
11 12.0
12 13.0
13 14.0
14 15.0
15 NaN
Name: col4, dtype: float64
<class 'pandas.core.series.Series'>
shift는 DataFrame의 하나의 행에만 적용할 수도 있습니다.
위 예시는 df_test의 col4에만 shift를 적용시켰습니다.
loc[:, 'col4']를 보면 column이름인 col4에 대괄호가 쳐져있지 않으므로 이것은 col4를 Series로 반환합니다.
따라서 위 예시에서 shift는 Series에 적용된 것과 같으므로 shift의 return값도 Series입니다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
6, 7, 8, 9,
10, 11, 12,
13, 14, 15
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_shifted = df_test.loc[:, ['col4']].shift(-1)
print(df_shifted)
print(type(df_shifted))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 6
7 2 a 2050 7
8 2 b 2000 8
9 2 b 2200 9
10 3 a 3000 10
11 3 a 3100 11
12 3 b 3200 12
13 4 a 4200 13
14 4 b 4100 14
15 4 b 4150 15
col4
0 2.0
1 3.0
2 4.0
3 5.0
4 6.0
5 6.0
6 7.0
7 8.0
8 9.0
9 10.0
10 11.0
11 12.0
12 13.0
13 14.0
14 15.0
15 NaN
<class 'pandas.core.frame.DataFrame'>
이번엔 loc.[:, ['col4']] 처럼 column이름에 대괄호를 쳐서 loc가 DataFrame을 return하게 했습니다.
따라서 여기에 적용된 shift도 DataFrame에 대해 적용되는 것이므로 shift의 return값도 DataFrame입니다.
shift는 자신이 적용된 대상의 data type과 동일한 data type의 결과를 return합니다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
6, 7, 8, 9,
10, 11, 12,
13, 14, 15
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_group_shifted = df_test.groupby(by=['col1', 'col2'])[['col4']].shift(-1)
print(df_group_shifted)
print(type(df_group_shifted))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 6
7 2 a 2050 7
8 2 b 2000 8
9 2 b 2200 9
10 3 a 3000 10
11 3 a 3100 11
12 3 b 3200 12
13 4 a 4200 13
14 4 b 4100 14
15 4 b 4150 15
col4
0 2.0
1 3.0
2 NaN
3 5.0
4 6.0
5 NaN
6 7.0
7 NaN
8 9.0
9 NaN
10 11.0
11 NaN
12 NaN
13 NaN
14 15.0
15 NaN
<class 'pandas.core.frame.DataFrame'>
shift는 groupby와 함께 사용될 수 있습니다.
위 예시를 보면 col1, col2를 기준으로 groupby를 하고 groupby된 col4에 shift를 적용합니다.
따라서 결과를 보면 shift가 동일한 col1, col2값을 가진 행들의 그룹 내에서 적용된 것을 볼 수 있습니다.
(index=0, 1, 2 행이 동일한 col1, col2 값을 가지고있으므로 index=0, 1, 2에 있는 col4값을 위쪽으로 한 칸씩 올린 모습을 볼 수 있습니다. index=2는 동일한 col1, col2값을 가진 다음 행이 없으므로 NaN으로 표시되는 것도 볼 수 있죠.)
import pandas as pd
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
6, 7, 8, 9,
10, 11, 12,
13, 14, 15
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.loc[:, 'col5'] = df_test.groupby(by=['col1'])['col3'].shift(-2)
print(df_test)
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 6
7 2 a 2050 7
8 2 b 2000 8
9 2 b 2200 9
10 3 a 3000 10
11 3 a 3100 11
12 3 b 3200 12
13 4 a 4200 13
14 4 b 4100 14
15 4 b 4150 15
col1 col2 col3 col4 col5
0 1 a 1000 1 1200.0
1 1 a 1100 2 1300.0
2 1 a 1200 3 1050.0
3 1 b 1300 4 1100.0
4 1 b 1050 5 NaN
5 1 b 1100 6 NaN
6 2 a 2100 6 2000.0
7 2 a 2050 7 2200.0
8 2 b 2000 8 NaN
9 2 b 2200 9 NaN
10 3 a 3000 10 3200.0
11 3 a 3100 11 NaN
12 3 b 3200 12 NaN
13 4 a 4200 13 4150.0
14 4 b 4100 14 NaN
15 4 b 4150 15 NaN
위같은 방식으로 groupby와 shift로 이동된 데이터를 원본 DataFrame의 어떤 column에 할당할 수도 있습니다.
import pandas as pd
dict_test = {
'col1': [
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3,
4, 4, 4
],
'col2': [
'a', 'a', 'a', 'b', 'b', 'b',
'a', 'a', 'b', 'b',
'a', 'a', 'b',
'a', 'b', 'b'
],
'col3': [
1000, 1100, 1200, 1300, 1050, 1100,
2100, 2050, 2000, 2200,
3000, 3100, 3200,
4200, 4100, 4150
],
'col4': [
1, 2, 3, 4, 5, 6,
6, 7, 8, 9,
10, 11, 12,
13, 14, 15
]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_rolling_sum_1 = df_test.groupby(by=['col1', 'col2'])[['col4']].rolling(2).apply(sum)
print(df_rolling_sum_1)
print(type(df_rolling_sum_1))
df_rolling_sum_2 = df_test.groupby(by=['col1', 'col2'])[['col4']].rolling(2).apply(sum).shift(-1)
print(df_rolling_sum_2)
print(type(df_rolling_sum_2))
-- Result
col1 col2 col3 col4
0 1 a 1000 1
1 1 a 1100 2
2 1 a 1200 3
3 1 b 1300 4
4 1 b 1050 5
5 1 b 1100 6
6 2 a 2100 6
7 2 a 2050 7
8 2 b 2000 8
9 2 b 2200 9
10 3 a 3000 10
11 3 a 3100 11
12 3 b 3200 12
13 4 a 4200 13
14 4 b 4100 14
15 4 b 4150 15
col4
col1 col2
1 a 0 NaN
1 3.0
2 5.0
b 3 NaN
4 9.0
5 11.0
2 a 6 NaN
7 13.0
b 8 NaN
9 17.0
3 a 10 NaN
11 21.0
b 12 NaN
4 a 13 NaN
b 14 NaN
15 29.0
<class 'pandas.core.frame.DataFrame'>
col4
col1 col2
1 a 0 3.0
1 5.0
2 NaN
b 3 9.0
4 11.0
5 NaN
2 a 6 13.0
7 NaN
b 8 17.0
9 NaN
3 a 10 21.0
11 NaN
b 12 NaN
4 a 13 NaN
b 14 29.0
15 NaN
<class 'pandas.core.frame.DataFrame'>
shift는 rolling과도 같이 사용될 수 있습니다.
위 예시를 보면 col1, col2를 기준으로 그룹화된 DataFrame의 col4에 2개 행(현재행, 그 이전행)에 대해 rolling sum을 진행한 것이 df_rolling_sum_1이고,
여기에 shift를 추가로 적용한게 df_rolling_sum_2입니다.
이 두 결과를 비교해보면 데이터는 똑같으나 shift(-1)이 적용된 결과는 동일한 group(=동일한 col1, col2 값을 가진 행들) 내에서 col4의 rooling sum 값이 한줄씩 위로 옮겨긴걸 볼 수 있습니다.
import pandas as pd
dict_test = {
'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'col2': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b'],
'col3': [1000, 1200, 1100, 1050, 1300, 900, 1500, 2000, 1800, 1600]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_rolling_sum = df_test.groupby(by=['col2'])[['col3']].rolling(2).apply(sum).shift(-1)
df_rolling_sum = df_rolling_sum.reset_index(drop=False, inplace=False)
print(df_rolling_sum)
print(type(df_rolling_sum))
df_test.loc[:, 'new_col3'] = df_rolling_sum.loc[:, 'col3']
print(df_test)
print(type(df_test))
-- Result
col1 col2 col3
0 1 a 1000
1 2 a 1200
2 3 a 1100
3 4 a 1050
4 5 b 1300
5 6 b 900
6 7 b 1500
7 8 b 2000
8 9 b 1800
9 10 b 1600
col2 level_1 col3
0 a 0 2200.0
1 a 1 2300.0
2 a 2 2150.0
3 a 3 NaN
4 b 4 2200.0
5 b 5 2400.0
6 b 6 3500.0
7 b 7 3800.0
8 b 8 3400.0
9 b 9 NaN
<class 'pandas.core.frame.DataFrame'>
col1 col2 col3 new_col3
0 1 a 1000 2200.0
1 2 a 1200 2300.0
2 3 a 1100 2150.0
3 4 a 1050 NaN
4 5 b 1300 2200.0
5 6 b 900 2400.0
6 7 b 1500 3500.0
7 8 b 2000 3800.0
8 9 b 1800 3400.0
9 10 b 1600 NaN
<class 'pandas.core.frame.DataFrame'>
위 예시는 rolling sum과 shift를 적용한 결과를 df_test의 new_col3라는 새로운 컬럼에 할당하고 있는 예시입니다.
보시면 rolling sum + shift(-1)의 결과로 생성된 df_rolling_sum의 col3의 값이 df_test의 new_col3에 그대로 할당된것을 볼 수 있죠.
pycharm pytest error (0) | 2023.11.16 |
---|---|
graphviz 설치 후 오류 (Anaconda) (0) | 2018.08.10 |
ubuntu Jupyter (0) | 2018.07.13 |
numpy axis (0) | 2018.07.13 |
docker 한글설정 (0) | 2018.07.07 |
빠른 개발 -> 코드 공유 -> 쉬운 개선
React Native는 단 기간에 프로덕션 레벨의 크로스 플랫폼 앱을 만들어야 할 때 고려할 수 있는 여러 선택지 중 가장 가성비가 좋은 프레임워크다.
React Component -> React Native -> Bridge -> Android, iOS
Bridge 특징
1. Asynchronous
AS-IS Native 동기화 호출: 완료 시점까지 Javascript 처리 대기
TO-BE Native 비동기 호출: 완료 시점까지 Javascript 처리 진행
2. Serializable
AS-IS 독립적으로 운영되는 두 영역 간의 데이터 공유: 많은 관리 이슈 발생
TO-BE 직렬화 된 메시지 교환: 간결해진 구조 대신 성능 저하 발생
3. Batched
AS-IS Native 호출마다 직렬화와 역직렬화의 과정에서 부하 발생
TO-BE 큐에 넣어 5ms 단위로 일괄 처리하는 방식으로 성능 개선
Bridge 모니터링
import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue'; MessageQueue.spy(true); MessageQueue.spy((info) => console.log("I'm spying!", info));
react-native의 발전방향
Facebook의 개선 방향
속 편하게 처음부터 빌드 방식(react-native-cli)으로 시작해라
기본적인 작업 (레이아웃, 데이터 연동) -> 복잡한 애니메이션 & 인터랙션 확인 -> iOS에 특화된 UX 작업
중간에 안드로이드에서 확인하지 않으면 나중에 놀랄 수 있음!
상대경로 말고 절대경로를 사용하고 싶다면 babel-plugin-root-import를 적용
// AS-IS if(data && data.items && data.items.length > 2) { drawList(data); } // TO-BE if(data?.items?.length > 2) { drawList(data); }
Optional chaining operator 사용으로 쉽게 Null Safety 코딩! (0.56 버전부터 가능)
잘못된 라이브러리 업데이트는 고통을 불러옴
버전 고정하는 방법
$ npm install --save --save-exact react-native-fbsdk $ yarn add --exact react-native-fbsdk
$ npm config set save-exact=true
Flow를 적용해서 타입을 정의하면 파라미터 타입 오류의 사전 감지가 가능
요즘은 타입스크립트도 지원이 많이 되어서 괜찮음
자신이 짠 코드를 babel로 어떻게 변환되는지 확인해보는 것도 의미 있음
$ npm -g install js-beautify
$ react-native bundle --platform android --dev false --entry-file index.js --bundle-output index.android.bundle $ js-beautify index.android.bundle > index.android.bundle.js
AS-IS Javascript packager가 동작하는 방식: Bundle 파일 생성 -> 모듈 ID로 치환
TO-BE App Resources 사용하기
내장 Image 컴포넌트의 문제
// SDWebImage (iOS) / Glide (Android) 라이브러리 사용으로 문제점 개선 $ npm install react-native-fast-image
import StyleSheet from './PlatformStyleSheet'; const styles = StyleSheet.create({ title: { fontSize: 16, ios: { fontSize: 18 }, android: { fontSize: 17, color: 'red' } } });
import { Platform, StyleSheet } from 'react-native'; const PlatformStyleSheet = { create(styles) { const platformStyles = {}; for (const key in styles) { const { ios, android, ...style } = styles[key]; (ios || android) && Object.assign(style, Platform.select({ios, android})); platformStyles[key] = style; } return StyleSheet.create(platformStyles); }, } export default PlatformStyleSheet;
class Text extends PureComponent { static defaultStyle = Platform.select({ ios: { fontFamily: 'AppleSDGothicNeo-Regular' }, android: { fontFamily: 'sans-serif', includeFontPadding: false } }); render() { const { children, style, ...props } = this.props; return <Text {...props} allowFontScaling={false} style={[Text.defaultStyle, style]}> {children} </Text>; } }
<TouchableWithourFeedback hitSlop={{top: 7, right: 7, bottom: 7, left: 7}}> <View .../> </TouchableWithourFeedback>
requestAnimationFrame 함수 실행 -> 값 계산 후 View.setNativeProps 함수 실행 -> Bridge로 전달 -> UI 업데이트
메인 쓰레드에서 프레임마다 실행 -> 계산된 값으로 직접 View 업데이트 호출 -> UI 업데이트
Animated.timing(this._animation, { toValue: 1, duration: 1000, useNativeDriver: true, // add this }).start();
반복되는 애니메이션이 있다면 등록한 코드가 실행되지 않거나 실행 시점의 문제 발생
현재 프레임의 다른 실행을 보장해서 앱 반응성 개선
import { InteractionManager } from 'react-native'; componentDidMount() { InteractionManager.runAfterInteractions(() => { this.doExpensiveAction(); }); } handleOnPress() { requestAnimationFrame(() => { this.doExpensiveAction(); }); }
높이가 고정된 구성이라면 레이아웃의 크기를 매번 계산하지 않아서 성능 개선
<FlatList getItemLayout={(data, index) => { { length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index } )} />
Deprecated된 방식으로 사용하지 마세요.
// 레퍼런스 할당 <TextInput ref={'inputField'} /> // 레퍼런스 사용 this._refs.inputField.focus();
컴포넌트에 인라인 함수를 사용하는 건 좋지 않아요.
// 레퍼런스 할당 <TextInput ref={ component => this._inputField = component } /> // 레퍼런스 사용 this._inputField.focus();
React 16.3 버전부터 제공하는 효율적인 방식을 사용하세요.
// 레퍼런스 생성 this._inputFieldRef = React.createRef(); // 레퍼런스 할당 <TextInput ref={this._inputFieldRef} /> // 레퍼런스 사용 this._inputFieldRef.current.focus();
android { compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { minSdkVersion 16 targetSdkVersion 22 } }
def safeExtGet(prop, fallback) { rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback } android { compileSdkVersion safeExtGet('compileSdkVersion', 27) buildToolsVersion safeExtGet('buildToolsVersion', '27.0.3') defaultConfig { minSdkVersion safeExtGet('minSdkVersion', 16) targetSdkVersion safeExtGet('targetSdkVersion', 26) } }
// android/app/build.gradle def enableSeparateBuildPerCPUArchitecture = true
// android/app/build.gradle def enableProguardInReleaseBuilds = true
$ npm install --save-dev babel-plugin-transform-remove-console
// .babelrc { "env": { "production": { "plugins": ["transform-remove-console"] } } }
// android/app/build.gradle android { defaultConfig { resConfigs "en", "ko" } }
TinyPNG, OptiPNG
Adobe After Effects로 작업한 애니메이션을 JSON 형식으로 export하면 끝
<LottieView source={require('./animation.json')} autoPlay loop />
출처
도움되는 링크
ReactNative Setting (0) | 2020.05.08 |
---|
npm install -g react-native-cli
or
npm install -g expo-cli
프로젝트 생성
react-native init [프로젝트명]
or
expo init [프로젝트명]
cd [프로젝트명]
=== react-native
npm start ==> 프로젝트 시작
또 다른 창에 (실행했는데 에러난다면)
android/app/src/main 폴더에서 assets 폴더 생성
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
--platform android : 안드로이드 빌드
--dev false: 릴리즈 모드로 빌드
--entry-file index.js : index.js를 시작으로 번들링 할 것
--bundle-output *** : 번들결과 파일 위치 및 파일명 설정
--assets-dest *** : 리소스 경로 설정
끝나면
react-native run-android ==> simulator 가 뜬다
==== expo
yarn start
빌드는?
번들링 생성 시
cd android
./gradlew bundleRelease
or
cd android && ./gradlew bundleRelease
여러번 빌드하다보면 번들링 결과가 여러번 생성되므로 정리해주자.
cd android && ./gradlew clean && ./gredlew bundleRelease
apk 생성해야한다면 assembleRelease
cd android && ./gradlew assembleRelease
빌드 후 android/app/build/outputs에 결과 파일 생성
release 버전으로 구동 테스트할 때는 --variant=release 옵션을 넣고 실행하면 된다.
react-native run-android --variant=release
빌드 옵션 상세 ./gradlew bundleRelease 의 상세
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
--platform android : 안드로이드 빌드
--dev false: 릴리즈 모드로 빌드
--entry-file index.js : index.js를 시작으로 번들링 할 것
--bundle-output *** : 번들결과 파일 위치 및 파일명 설정
--assets-dest *** : 리소스 경로 설정
react-native: 웹 개발자가 한달만에 앱 출시하기 (0) | 2020.05.08 |
---|
설치 환경은
Anaconda3 python 3.5
증상
conda install graphviz 로 설치하고
프로그램을 수행하면 아래와 같이 뜬다
No module named graphviz
원인
conda install 하면 graphviz 폴더를
~/Anaconda3/Library/bin/ 로 설치를 한다
문제는 python interpreter 가 이 위치를 읽지 못한다는 것
해결
graphviz 폴더를 복사해서
~/Anaconda3/Lib/site-packages 하위로 복사해준다
결과
No module 문제는 해결 된다
----------------------------------------------------------------
증상
[dot, ~]가 excutable 하지 않다고 나옴
원인
graphviz download 사이트에 들어가 찾아보면
더이상 자동으로 PATH를 잡아주지 않는다고
dot 명령이 바로 실행 되도록 알아서 PATH를 잡으라고 한다
해결
~\Anaconda3\Lib\site-packages\graphviz 를
PATH에 추가한다
결과
코드가 실행된다
만약 실행이 안되면 창을 다 닿았다가 다시 실행해보자
그래도 안되면 pip install graphviz 를 해보자
(사실 설치중에 conda install 과 pip install 이 된 상태여서 이게 결함인지는 모르겠다)
출처: http://livetoday.tistory.com/entry/graphviz-설치-후-오류-Anaconda [Hero]
pycharm pytest error (0) | 2023.11.16 |
---|---|
Dataframe shift (0) | 2022.12.23 |
ubuntu Jupyter (0) | 2018.07.13 |
numpy axis (0) | 2018.07.13 |
docker 한글설정 (0) | 2018.07.07 |
bash Anaconda3-4.2.0-Linux-x86_64.sh
~/anaconda3
경로에 설치되어 있을 것이다. sudo 권한으로 설치한 것이 아니므로, 자신이 마음대로 삭제할 수도 있다는 점을 유의한다. 또한 앞으로 새로 추가할 패키지들 역시 sudo 권한이 불필요할 것이다.conda update conda
conda update anaconda
conda create --name JUPYTER ipython
source activate JUPYTER
conda install jupyter
sudo add-apt-repository ppa:staticfloat/juliareleases
sudo add-apt-repository ppa:staticfloat/julia-deps
sudo apt-get update
sudo apt-get install julia
julia
실행한 후, Julia 안에서 다음 명령을 넣어서 Julia 언어에서 사용할 확률이 가장 높은 모듈들을 추가 설치한다.
Pkg.init()
Pkg.add("Jewel")
Pkg.add("Images")
Pkg.add("PyPlot")
Pkg.add("IJulia")
Pkg.update()
quit()
sudo apt-get install build-essential cmake
sudo add-apt-repository ppa:octave/stable
sudo apt-get update
sudo apt-get install octave
octave-cli
octave
sudo chown -hR 계정:계정 ~/.config/octave
pip install octave_kernel
python -m octave_kernel.install
pip install bash_kernel
python -m bash_kernel.install
pip install jupyter-c-kernel
cd ~
git clone https://github.com/brendan-rius/jupyter-c-kernel.git
mkdir ~/.local/share/jupyter/kernels/c_spec
cp ./jupyter-c-kernel/c_spec/kernel.json ~/.local/share/jupyter/kernels/c_spec/kernel.json
jupyter kernelspec list
mkdir ~/github/My-Jupyter-Notebooks
http://localhost:8888
로만 연결 가능하다.jupyter notebook --generate-config
/home/dong/.jupyter/jupyter_notebook_config.py
파일이 새로 생겨난 것을 확인.python
쳐서 파이썬 REPL로 들어간 다음,from notebook.auth import passwd
passwd()
위와 같이 명령을 때려주면 비밀번호를 치라고 나오는데 확인차 2번 쳐 주면 해쉬코드로 된 비밀번호 코드가 나온다. 해쉬코드를 긁어다 복사해 두거나 메모해 둔다. 그리고 python 콘솔을 빠져나오려면
exit()
nano /home/계정/.jupyter/jupyter_notebook_config.py
#
의 유무를 잘 비교해서 확인하자.c.NotebookApp.ip = '*'
c.NotebookApp.port = 8888
c.NotebookApp.notebook_dir = u'/home/계정/github/My-Jupyter-Notebooks'
c.NotebookApp.open_browser = False
`
* 그리고, 비밀번호 해쉬코드도 다음과 같은 형식으로 넣어준다.
`
c.NotebookApp.password = u'sha1:67c9e6어쩌구저쩌구71089e11aed'
sudo ufw allow 8888
jupyter notebook
jupyter notebook --no-browser
jupyter notebook --notebook-dir='디렉토리경로'
비밀번호 로그인, 설치된 커널의 활성화 여부 등을 확인한다.
Ctrl+c
, y
를 쳐서 종료한다.nano ~/Start_Jupyter.sh
한 다음 다음 내용을 써 넣고 저장 후 종료.
#!/bin/bash
/home/계정/anaconda3/bin/jupyter notebook &
chmod +x ~/Start_Jupyter.sh
sudo nano /etc/rc.local
sudo -u 계정 /home/계정/Start_Jupyter.sh
sudo reboot now
sudo systemctl enable rc-local.service
conda install -c conda-forge jupyter_contrib_nbextensions
pip install jupyterthemes
jt -l
을 쳐 주면 다음과 같이 4가지 테마가 나온다.onedork
grade3
oceans16
chesterish
jt -t grade3 -T -N
jt -r
을 주면 된다고 하는데, 해 봐도 원상복귀가 안된다! ㅠㅠ~/.jupyter/custom/custom.css
파일을 만들고 편집기로 다음 내용을 집어넣으면 원래 오리지널 테마로 복원된다..rendered_html pre, .rendered_html code, pre, .CodeMirror, .prompt {
font-family: 나눔고딕코딩, Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;;
}
.rendered_html pre,
.rendered_html code {
font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;
background-color: #f5f5f5;
}
.rendered_html pre {
padding: 8.5px;
border: 1px solid #ccc;
border-radius: 2px;
}
.rendered_html p > code,
.rendered_html ul li code {
border: solid 1px #e1e4e5;
color: #E74C3C;
padding: 0 5px;
overflow-x: auto;
}
blockquote {
background-color: #fcf2f2;
border-color: #dFb5b4;
border-left: 5px solid #dfb5b4;
padding: 0.5em;
}
conda install -c conda-forge jupyterlab
julia lab
Dataframe shift (0) | 2022.12.23 |
---|---|
graphviz 설치 후 오류 (Anaconda) (0) | 2018.08.10 |
numpy axis (0) | 2018.07.13 |
docker 한글설정 (0) | 2018.07.07 |
file "/usr/bin/pip" line 9, in <module> (0) | 2018.07.03 |
[[1 2 3]
[4 5 6]]
np.sum(a, axis=0) : [5 7 9]
np.sum(a, axis=1) : [6 15]
graphviz 설치 후 오류 (Anaconda) (0) | 2018.08.10 |
---|---|
ubuntu Jupyter (0) | 2018.07.13 |
docker 한글설정 (0) | 2018.07.07 |
file "/usr/bin/pip" line 9, in <module> (0) | 2018.07.03 |
[OpenCV] face detection (0) | 2018.06.28 |
● interactive mode 로 도커 이미지 실행.아래 명령을 사용하여 우분투 이미지를 실행하여 현재 locale 을 확인한다. 현재 도커 레포지토리를 통해 배포되는 대부분의 우분투 이미지는 locale 설정이 안되어 있을것이다. (외국 애들은 한글이나 일본어, 중국어 따윈 관심 없을테니...) docker run -it [IMAGE] /bin/bash [zany@dione ~]$ docker run -it -u root ubuntu:base /bin/bash [root@510a1395b315 ~]# locale LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= [root@510a1395b315 ~]# locale -a C C.UTF-8 POSIX [root@510a1395b315 ~]# ls /usr/share/i18n/locales/ ls: cannot access '/usr/share/i18n/locales/': No such file or directory locale 명령을 입력해보면, POSIX 로 표기될 것이고 locale -a 명령으로 사용 가능한 locale 목록을 보면 위 결과와 같이 몇개 안나올 것이다. /usr/share/i18n/locales 디렉토리는 존재하지도 않는다. echo '한글' 명령으로 tty 에서 한글이 되는지 확인하지도 못한다. echo '한글' 이라는 명령어 자체도 입력 못할테니... ● 우분투 패키지 매니저로 locales 설치 locale 이 있어야 설정을 하든 말든 할테니... 일단 우분투 패키지 매니저(apt-get)를 통해 locales 패키지를 설치하자 (아래 명령) apt-get upgrade 는 OS 에 설치된 패키지를 업그레이드 할 것이니 필요치 않으면 빼도 무방하다. apt-get clean && apt-get update && apt-get upgrade && apt-get install locales [root@510a1395b315 ~]# apt-get clean && apt-get update && apt-get upgrade && apt-get install locales Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB] Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB] Get:3 http://security.ubuntu.com/ubuntu xenial-security/universe Sources [51.1 kB] Get:4 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB] ... 어쩌구 저쩌구 생략 ... Selecting previously unselected package locales. (Reading database ... 13279 files and directories currently installed.) Preparing to unpack .../locales_2.23-0ubuntu9_all.deb ... Unpacking locales (2.23-0ubuntu9) ... Setting up locales (2.23-0ubuntu9) ... debconf: unable to initialize frontend: Dialog debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.) debconf: falling back to frontend: Readline Generating locales (this might take a while)... Generation complete. 정상적으로 처리되었으면, /usr/share/i18n/locales/ 디렉토리에 locale 파일들이 생겼을 것이다. ls 명령으로 /usr/share/i18n/locales/ 디렉토리의 내용을 보자. ls /usr/share/i18n/locales/ [root@510a1395b315 ~]# ls /usr/share/i18n/locales/ C bs_BA en_ZM ga_IE@euro li_BE ps_AF tk_TM POSIX byn_ER en_ZW gd_GB li_NL pt_BR tl_PH aa_DJ ca_AD eo gez_ER lij_IT pt_PT tn_ZA aa_ER ca_ES eo_US gez_ER@abegede ln_CD pt_PT@euro tr_CY aa_ER@saaho ca_ES@euro es_AR gez_ET lo_LA quz_PE tr_TR aa_ET ca_ES@valencia es_BO gez_ET@abegede lt_LT raj_IN translit_circle af_ZA ca_FR es_CL gl_ES lv_LV ro_RO translit_cjk_compat ak_GH ca_IT es_CO gl_ES@euro lzh_TW ru_RU translit_cjk_variants am_ET ce_RU es_CR gu_IN mag_IN ru_UA translit_combining an_ES ckb_IQ es_CU gv_GB mai_IN rw_RW translit_compat anp_IN cmn_TW es_DO ha_NG mg_MG sa_IN translit_font ar_AE crh_UA es_EC hak_TW mhr_RU sat_IN translit_fraction ar_BH cs_CZ es_ES he_IL mi_NZ sc_IT translit_hangul ar_DZ csb_PL es_ES@euro hi_IN mk_MK sd_IN translit_narrow ... 생략 ... apt-get install locales 명령시 자동으로 locale-gen 명령이 수행되지만, /usr/share/i18n/locales 디렉토리가 아직 보이지 않으면 locale-gen 명령을 별도로 수행해보자. locales 패키지를 설치하여도 사용 가능한 locale 을 확인해보면 아직 원하는 것이 나오지 않는다. locale -a [root@510a1395b315 ~]# locale -a C C.UTF-8 POSIX ● locale 생성 / 등록 localedef 명령을 이용하여 필요한 locale 을 컴파일해준다. -i 옵션은 inputfile 을 의미하며 -f 옵션은 문자셋을 의미한다. localedef 명령 후, locale -a 명령으로 사용 가능한 locale 을 확인해보면 새로 추가한 2개의 항목이 보일 것이다. localedef -i ko_KR -f UTF-8 ko_KR.UTF-8 localedef -i en_US -f UTF-8 en_US.UTF-8 locale -a [root@510a1395b315 ~]# localedef -i ko_KR -f UTF-8 ko_KR.UTF-8 [root@510a1395b315 ~]# localedef -i en_US -f UTF-8 en_US.UTF-8 [root@510a1395b315 ~]# locale -a C C.UTF-8 POSIX en_US.utf8 ko_KR.utf8 ● locale 관련 패키지 재설정 (optional) dpkg-reconfigure 명령으로 locale 설정을 다시 해준다. 아래 명령어를 실행하면 2가지를 묻는다. 1. 어떤 locale 을 사용할 것이냐? 2. 시스템 환경을 위한 기본 locale 을 뭘로 할꺼냐? dpkg-reconfigure locales [root@510a1395b315 ~]# dpkg-reconfigure locales perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "ko_KR.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). debconf: unable to initialize frontend: Dialog debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.) debconf: falling back to frontend: Readline Configuring locales ------------------- Locales are a framework to switch between multiple languages and allow users to use their language, country, characters, collation order, etc. Please choose which locales to generate. UTF-8 locales should be chosen by default, particularly for new installations. Other character sets may be useful for backwards compatibility with older systems and software. 1. All locales 162. es_CL ISO-8859-1 323. mni_IN UTF-8 2. aa_DJ ISO-8859-1 163. es_CL.UTF-8 UTF-8 324. mr_IN UTF-8 3. aa_DJ.UTF-8 UTF-8 164. es_CO ISO-8859-1 325. ms_MY ISO-8859-1 4. aa_ER UTF-8 165. es_CO.UTF-8 UTF-8 326. ms_MY.UTF-8 UTF-8 5. aa_ER@saaho UTF-8 166. es_CR ISO-8859-1 327. mt_MT ISO-8859-3 6. aa_ET UTF-8 167. es_CR.UTF-8 UTF-8 328. mt_MT.UTF-8 UTF-8 7. af_ZA ISO-8859-1 168. es_CU UTF-8 329. my_MM UTF-8 8. af_ZA.UTF-8 UTF-8 169. es_DO ISO-8859-1 330. nan_TW UTF-8 9. ak_GH UTF-8 170. es_DO.UTF-8 UTF-8 331. nan_TW@latin UTF-8 10. am_ET UTF-8 171. es_EC ISO-8859-1 332. nb_NO ISO-8859-1 ... 생략 ... (Enter the items you want to select, separated by spaces.) Locales to be generated: 290 ... 생략 ... This will select the default language for the entire system. If this system is a multi-user system where not all users are able to speak the default language, they will experience difficulties. 1. None 2. C.UTF-8 3. ko_KR.UTF-8 Default locale for the system environment: 3 ko_KR.UTF-8 이 290 번 이어서 290 으로 입력 하였으나, OS 버전에 따라 다를 수 있으니 목록에서 적절한 번호를 골라 입력한다. ● .bashrc 에 LANG 환경값 추가 LANG 환경값을 .bashrc 에 등록해준다. export LANG=ko_KR.UTF-8 ● 도커 커밋 후... 재실행.. 확인. 현재 도커를 커밋하고 종료 후 재실행하여 locale 이 정상적으로 적용되었는지 확인하자. 도커를 커밋하지 않으면 변경 내용이 이미지에 기록되지 않으니 꼭 커밋하고 재실행해서 확인하자. docker commit -p [CONTAINER] [REPOSITORY[:TAG]] [zany@dione ~]$ docker commit -p 510a1395b315 ubuntu:base sha256:65afd6c09559b1001316c067b075e3a73c5aa02132752a9e184b0dedf2be2097 [root@a0610820dc88 ~]# locale LANG=ko_KR.UTF-8 LANGUAGE= LC_CTYPE="ko_KR.UTF-8" LC_NUMERIC="ko_KR.UTF-8" LC_TIME="ko_KR.UTF-8" LC_COLLATE="ko_KR.UTF-8" LC_MONETARY="ko_KR.UTF-8" LC_MESSAGES="ko_KR.UTF-8" LC_PAPER="ko_KR.UTF-8" LC_NAME="ko_KR.UTF-8" LC_ADDRESS="ko_KR.UTF-8" LC_TELEPHONE="ko_KR.UTF-8" LC_MEASUREMENT="ko_KR.UTF-8" LC_IDENTIFICATION="ko_KR.UTF-8" LC_ALL= [root@a0610820dc88 ~]# echo '한글' 한글 [root@a0610820dc88 ~]# |
ubuntu Jupyter (0) | 2018.07.13 |
---|---|
numpy axis (0) | 2018.07.13 |
file "/usr/bin/pip" line 9, in <module> (0) | 2018.07.03 |
[OpenCV] face detection (0) | 2018.06.28 |
[OpenCV] 영상 얼굴 인식 (face detection) (0) | 2018.06.28 |
vi /usr/bin/pip
from pip import main
if __name__ == '__main__':
sys.exit(main())
요렇게 변경
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
numpy axis (0) | 2018.07.13 |
---|---|
docker 한글설정 (0) | 2018.07.07 |
[OpenCV] face detection (0) | 2018.06.28 |
[OpenCV] 영상 얼굴 인식 (face detection) (0) | 2018.06.28 |
numpy 배열 쪼개기 (0) | 2018.01.05 |
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('redvelvet.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for(ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
https://blog.naver.com/limitsinx/221137914300
docker 한글설정 (0) | 2018.07.07 |
---|---|
file "/usr/bin/pip" line 9, in <module> (0) | 2018.07.03 |
[OpenCV] 영상 얼굴 인식 (face detection) (0) | 2018.06.28 |
numpy 배열 쪼개기 (0) | 2018.01.05 |
2. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
import cv2
cap = cv2.VideoCapture('testvideo.divx')
face_pattern = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faceList = face_pattern.detectMultiScale(gray, 1.5)
for (x, y, w, h) in faceList:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)
cv2.imshow('image', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
file "/usr/bin/pip" line 9, in <module> (0) | 2018.07.03 |
---|---|
[OpenCV] face detection (0) | 2018.06.28 |
numpy 배열 쪼개기 (0) | 2018.01.05 |
2. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
1. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
hsplit(array, number) 수평으로 쪼개기
vsplit(array, number) 수직으로 쪼개기
dsplit(array, number) 깊게 쪼개기
split(array, number, axis) 쪼개기 axis=0 수직으로 axis=1 수평으로
dsplit 쪼개기
[OpenCV] face detection (0) | 2018.06.28 |
---|---|
[OpenCV] 영상 얼굴 인식 (face detection) (0) | 2018.06.28 |
2. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
1. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
np.newaxis (0) | 2017.12.28 |
pyInstaller라는 게 있다.
http://www.pyinstall.org/
64비트에서도 잘 작동한다.
> python setup.py install 로 설치한다.
사용 시)
EXE로 만들기를 원하는 파이썬 스크립트를 찾아 CONSOLE에서 명령 실행
> pyinstaller.exe xxx.py
단일 파일로 만들 때는 -F 옵션 추가
> pyinstaller.exe -F xxx.py
GUI 프로그램의 경우, 실행 시 CONSOLE창을 숨기고 싶다면 --noconsole 옵션 추가
> pyinstaller.exe -F --noconsole xxx.py
[OpenCV] 영상 얼굴 인식 (face detection) (0) | 2018.06.28 |
---|---|
numpy 배열 쪼개기 (0) | 2018.01.05 |
1. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
np.newaxis (0) | 2017.12.28 |
python matplotlib 한글깨짐 (0) | 2017.12.28 |
py2exe는 python2 만 지원하는 것으로 알고 있고
python3에는 cx_freeze 라는 모듈을 사용해야한다.
cx_freeze - http://cx-freeze.sourceforge.net
py2exe - http://www.py2exe.org
> pip install cx_freeze
Setup.py 파일로 만들어서 실행 파일로 실행
import sys
import os
from cx_Freeze import setup, Executable
os.environ['TCL_LIBRARY'] = "c:/python/tcl/tcl8.6"
os.environ['TK_LIBRARY'] = "c:/python/tcl/tk8.6"
setup(name = "parser",
options={"build_exe": {"packages": ["tkinter", "matplotlib"],
"include_files": ['clienticon.ico']}},
version = "1.0",
description = "Parser",
author = "head1ton",
executables = [Executable("parser.py")])
만약 윈도우 GUI 프로그램인 경우 executables의 옵션을 입력해주어야 한다.
executables = [Executable("imgtk.py", base="Win32GUI")])
Setup.py 실행
> python setup.py build
설치파일로 만들 수도 있다.
> python setup.py bdist_msi
dist 폴더에 설치파일 생성.
참고 - http://sh1n2.tistory.com/123
numpy 배열 쪼개기 (0) | 2018.01.05 |
---|---|
2. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
np.newaxis (0) | 2017.12.28 |
python matplotlib 한글깨짐 (0) | 2017.12.28 |
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte (0) | 2017.12.18 |
import numpy as np
x = np.array([
[[2, 3, 1, 0],[12, 13, 11, 10],[22, 23, 21, 20]],
[[32, 33, 31, 30],[42, 43, 41, 40],[52, 53, 51, 50]]
])
print('x:', x)
print('x.shape:', x.shape)
X1 = x[:, np.newaxis, 1] # 모든 행에서 1열 값을 가져오고(행이됨), 축을 추가한다(열이됨)
print('X1:', X1)
print('X1.shape:', X1.shape)
X2 = x[:, 1, np.newaxis] # x[:, np.newaxis, 1]과 동일
print('X2:', X2)
print('X2.shape:', X2.shape)
X3 = x[1, np.newaxis, :] # 1행에서 모든 열값을 가져온다 (축추가로 열값이됨)
print('X3:', X3)
print('X3.shape:', X3.shape)
X4 = x[1, :, np.newaxis] # 1행에서 모든 열값을 가져온다 ( 축 추가로 행값이됨 )
print('X4:', X4)
print('X4.shape:', X4.shape)
X5 = x[:, np.newaxis] # 차원추가? 열추가?
print('X5:', X5)
print('X5.shape:', X5.shape)
2. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
---|---|
1. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
python matplotlib 한글깨짐 (0) | 2017.12.28 |
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte (0) | 2017.12.18 |
python iloc 와 loc 의 차이 (0) | 2017.12.17 |
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
1. python3 py파일 exe 실행파일 만들기 (0) | 2017.12.31 |
---|---|
np.newaxis (0) | 2017.12.28 |
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte (0) | 2017.12.18 |
python iloc 와 loc 의 차이 (0) | 2017.12.17 |
ravel(), transpose(), resize() (0) | 2017.12.13 |
df = pd.read_csv('./data/movie_review.csv', encoding='cp949')
np.newaxis (0) | 2017.12.28 |
---|---|
python matplotlib 한글깨짐 (0) | 2017.12.28 |
python iloc 와 loc 의 차이 (0) | 2017.12.17 |
ravel(), transpose(), resize() (0) | 2017.12.13 |
numpy 수학함수 (0) | 2017.12.02 |
python matplotlib 한글깨짐 (0) | 2017.12.28 |
---|---|
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte (0) | 2017.12.18 |
ravel(), transpose(), resize() (0) | 2017.12.13 |
numpy 수학함수 (0) | 2017.12.02 |
numpy 함수 (0) | 2017.12.02 |
>>>t = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>>x = np.array(t)
>>>type(x)
>>>x.shape
(3, 4)
>>>x.ravel()
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
>>>x.ravel().shape
(12,)
>>>x.shape = (6, 2)
>>>x
array([[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
[11, 12]])
>>>x.transpose()
array([[1, 3, 5, 7, 9, 11],
[2, 4, 6, 8, 10, 12]])
>>>x.resize((2, 6))
>>>x
array([[1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11, 12]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte (0) | 2017.12.18 |
---|---|
python iloc 와 loc 의 차이 (0) | 2017.12.17 |
numpy 수학함수 (0) | 2017.12.02 |
numpy 함수 (0) | 2017.12.02 |
numpy meshgrid (0) | 2017.12.02 |
https://docs.scipy.org/doc/numpy/reference/routines.math.html
python iloc 와 loc 의 차이 (0) | 2017.12.17 |
---|---|
ravel(), transpose(), resize() (0) | 2017.12.13 |
numpy 함수 (0) | 2017.12.02 |
numpy meshgrid (0) | 2017.12.02 |
window에서 패키지 설치 에러 해결하기 (0) | 2017.11.21 |
함수 이름 | 설명 |
array() | 입력 데이터(리스트, 튜플, 배열, 순차형 데이터 등)를 이용하여 배열을 생성한다. 생성시 적절한 데이터의 타입을 추정한다. 예시) arr = np.array([1, 2, 3]) |
arange() | 내장 range와 유사하지만 리스트 대신 ndarray를 반환한다. arr = np.arange(10) # 0부터 9까지의 정수 10개를 생성한다. np.arange(9).reshape((3, 3)) # 3행 3열의 numpy.ndarray를 반환한다.(0부터 시작) # 1.0부터 4.5까지 0.5씩 증가시키기 x = np.arange( 1.0, 4.1, 0.5 ) |
ones() | 주어진 dtype과 주어진 모양을 가지는 배열을 생성하고, 값을 모두 1로 초기화 시킨다. |
zeros((행수, 열수)) | 요소의 모든 내용이 0인 배열을 생성해준다. 예시) zeros((2,2)) : 요소의 값이 모두 0인 2 * 2의 배열을 생성한다. |
empty() | 배열을 생성하되, ones나 zeros처럼 값을 초기화 하지는 않는다. |
종류 | Type Code | 설명 |
int8, unit8 | i1, u1 | 부호가 있는 8비트 정수형과 부호가 없는 8비트 정수형 |
int16, unit16 | i2, u2 | 부호가 있는 16비트 정수형과 부호가 없는 16비트 정수형 |
int32, unit32 | i4, u4 | 부호가 있는 32비트 정수형과 부호가 없는 32비트 정수형 |
int64, unit64 | i8, u8 | 부호가 있는 64비트 정수형과 부호가 없는 64비트 정수형 |
float16 | f2 | 반정밀도 부동 소수점 |
float32 | f4 또는 f | 단정밀도 부동 소수점, C 언어의 float와 호환 |
float64 | f8 또는 d | 배정밀도 부동 소수점, C 언어의 double와 호환, 파이썬의 float 객체와 호환 |
함수 | 설명 |
abs, fabs | 각 원소의 절대값(정수, 실수, 복소수)을 구한다. 복소수가 아닌 경우 빠른 연산을 위하여 fabs를 사용한다. |
sqrt(배열) | 각 원소의 제곱근을 계산한다. arr ** 0.5와 동일한 결과이다. |
square | 각 원소의 제곱을 계산한다. arr ** 2와 동일한 결과이다. |
exp | 각 원소에서 지수 e*x를 계산한다. print(np.exp(1)) #2.71828182846 |
log, log10, log2, log1p | 각각 자연 로그, 로그 10, 로그 2, 로그(1+x) |
sign | 각 원소의 부호를 계산한다. 1(양수), 0(영), -1(음수) |
ceil | 각 원소의 소수 자리를 올린다. |
floor | 각 원소의 소수 자리를 버린다. |
rint | 각 원소의 소수 자리를 반올림한다. |
modf | 각 원소의 몫과 나머지를 각각의 배열로 반환한다. |
isnan | 각각의 원소가 숫자인지 아닌지를(NaN, Not A Number) 나타내는 Boolean 배열을 반환한다. |
isfinite, isinf | 배열의 각 원소가 유한한지(non-inf, non-Nan), 무한인지를 나타내는 Boolean 배열을 반환한다. |
cos, cosh, sin, sinh, tan, tanh | 일반 삼각 함수와 쌍곡 삼각 함수 |
arccos, arccosh, arcsin, arcsinh, arctan, arctanh | 역 삼각 함수 |
logical_not | 각 원소의 논리 부정(not) 값을 계산한다. |
함수 | 설명 |
add(배열a, 배열b) | 두 배열에서 같은 위치의 요소끼리 더한다. |
subtract(배열a, 배열b) | 첫 번째 배열의 요소에서 두 번째 배열의 원소를 뺀다. |
multiply(배열a, 배열b) | 배열의 요소끼리 곱한다. |
divide(배열a, 배열b), floor_divide | 첫 번째 배열의 요소에서 두 번째 배열의 원소를 나눈다. |
power | 첫 번째 배열의 요소에 두 번째 배열의 요소를 제곱한다. |
maximum, fmax | 두 원소 중에서 큰 값을 반환한다. fmax는 NaN을 무시한다. |
minimum, fmin | 두 원소 중에서 작은 값을 반환한다. fmin은 NaN을 무시한다. |
mod | 첫 번째 배열의 요소에 두 번째 배열의 원소를 나눈 나머지를 구한다. |
copysign | 첫 번째 배열의 요소의 기호를 두 번째 배열의 요소의 기호로 바꾼다. |
greater, greater_equal, less, less_equal, euqal, not_equal | 각각 두 원소 간의 >, >=, < , <=, ==, != 비교 연산 결과를 Boolean 배열로 반환한다. |
logical-and, logical_or, logical_xor | 각각 두 원소 간의 논리 연산 &, |, ^ 결과를 반환한다. |
메소드 | 설명 |
sum | 배열 전체 혹은 특정 축에 대한 모든 원소의 합을 계산한다. 크기가 0인 배열에 대한 연산 결과는 0이다. |
mean | 산술 평균을 구한다. 크기가 0인 배열에 대한 연산 결과는 NaN이다 |
std, var | 각각 표준 편차와 분산을 구한다. 선택적으로 자유도를 줄 수 있으면 분모의 기본 값은 n이다. |
min, max | 최소 값, 최대 값 |
argmin, argmax | 최소 원소의 색인 값, 최대 원소의 색인 값 |
cumsum | 누산 메소드라고 하는데, 각 원소의 누적 합을 구해준다.(cumulative sum) |
cumprod | 각 원소의 누적 곱 |
함수 | 설명 |
numpy.diag | 정사각 행렬의 대가/비대각 원소를 1차원 배열로 반환하거나 1차원 배열을 대각선 원소로 하고, 나머지는 0으로 채운 단위 행렬을 반환한다. |
numpy.dot() | 행렬과 행력 및 행렬과 벡터 간의 곱셈을 연산한다. |
numpy.trace | 행렬의 대각원 원소의 합을 계산한다. |
numpy.linalg.det | 행렬식을 게산한다. |
numpy.linalg.eig | 정사각 행렬의 고유 값과 고유 벡터를 계산한다. |
numpy.linalg.inv | 정사각 행렬의 역행렬을 계산한다. |
numpy.linalg.pinv | 행렬의 무어=펜로즈 유사역원 역행렬을 계산한다. |
numpy.linalg.qr | QR 분해를 계산한다. |
numpy.linalg.svd | 특이값 분해(SVD)를 계산한다. |
numpy.linalg.solve | A가 정사각 행렬일 때 Ax = b를 만족하는 x를 구한다. |
numpy.linalg.lstsq | y = xb를 만족하는 최소 제곱해를 구한다. |
함수 | 설명 |
seed() | 난수 발생기의 시드를 지정한다. 예시) np.random.seed(1000) |
permutation | 순서를 임의로 바꾸거나 임의의 순열을 반환한다. |
shuffle | 리스트나 배열의 순서를 뒤섞는다. |
rand | 균등 분포에서 표본을 추출한다. |
randint | 주어진 최소/치대 범위 안에서 임의의 난수를 추출한다. |
randn() | 표준 편차가 1이고 평균 값이 0인 정규 분포(matlab과 같은 방식)에서 표본을 추출한다. 예시 : arr = np.random.randn( 10 ) |
binomial | 이항 분포에서 표본을 추출한다. |
normal | 정규 분포(가우시안)에서 표본을 추출한다. |
beta | 베타 분포에서 표본을 추출한다. |
chisquare | 카이 제곱 분포에서 표본을 추출한다. |
gamma | 감마 분포에서 표본을 추출한다. |
uniform | 균등(0, 1) 분포에서 표본을 추출한다. |
standard_normal() | 정규 분포 샘플 데이터를 생성한다. 예시) y = np.random.standard_normal( 20 ) |
함수 | 설명 |
unique(x) | 배열 x에서 중복된 원소를 제거한 후 정렬하여 반환한다. |
intersect1d(x, y) | 배열 x와 y에 공통적으로 존재하는 원소를 정렬하여 반환한다. |
union1d(x, y) | 두 배열의 합집합을 반환한다. |
in1d(x, y) | x의 원소 중 y의 원소를 포함하는 지를 나타내는 불리언 배열을 반환한다. |
setdiff1d(x, y) | x와 y의 차집합을 반환한다. |
setxor1d(x, y) | 한 배열에는 포함되지만, 두 배열 모두에는 포함되지 않는 원소들의 집합인 대칭 차집합을 반환한다. |
ravel(), transpose(), resize() (0) | 2017.12.13 |
---|---|
numpy 수학함수 (0) | 2017.12.02 |
numpy meshgrid (0) | 2017.12.02 |
window에서 패키지 설치 에러 해결하기 (0) | 2017.11.21 |
python 가상환경 (0) | 2017.11.21 |
import numpy as np
samples = np.arange(-10, 10, 0.2)
print('sample: ', samples)
xs, ys = np.meshgrid(samples, samples)
print('xs: ', xs)
print('ys: ', ys)
sample: [ -1.00000000e+01 -9.80000000e+00 -9.60000000e+00 -9.40000000e+00
-9.20000000e+00 -9.00000000e+00 -8.80000000e+00 -8.60000000e+00
-8.40000000e+00 -8.20000000e+00 -8.00000000e+00 -7.80000000e+00
-7.60000000e+00 -7.40000000e+00 -7.20000000e+00 -7.00000000e+00
-6.80000000e+00 -6.60000000e+00 -6.40000000e+00 -6.20000000e+00
-6.00000000e+00 -5.80000000e+00 -5.60000000e+00 -5.40000000e+00
-5.20000000e+00 -5.00000000e+00 -4.80000000e+00 -4.60000000e+00
-4.40000000e+00 -4.20000000e+00 -4.00000000e+00 -3.80000000e+00
-3.60000000e+00 -3.40000000e+00 -3.20000000e+00 -3.00000000e+00
-2.80000000e+00 -2.60000000e+00 -2.40000000e+00 -2.20000000e+00
-2.00000000e+00 -1.80000000e+00 -1.60000000e+00 -1.40000000e+00
-1.20000000e+00 -1.00000000e+00 -8.00000000e-01 -6.00000000e-01
-4.00000000e-01 -2.00000000e-01 -3.55271368e-14 2.00000000e-01
4.00000000e-01 6.00000000e-01 8.00000000e-01 1.00000000e+00
1.20000000e+00 1.40000000e+00 1.60000000e+00 1.80000000e+00
2.00000000e+00 2.20000000e+00 2.40000000e+00 2.60000000e+00
2.80000000e+00 3.00000000e+00 3.20000000e+00 3.40000000e+00
3.60000000e+00 3.80000000e+00 4.00000000e+00 4.20000000e+00
4.40000000e+00 4.60000000e+00 4.80000000e+00 5.00000000e+00
5.20000000e+00 5.40000000e+00 5.60000000e+00 5.80000000e+00
6.00000000e+00 6.20000000e+00 6.40000000e+00 6.60000000e+00
6.80000000e+00 7.00000000e+00 7.20000000e+00 7.40000000e+00
7.60000000e+00 7.80000000e+00 8.00000000e+00 8.20000000e+00
8.40000000e+00 8.60000000e+00 8.80000000e+00 9.00000000e+00
9.20000000e+00 9.40000000e+00 9.60000000e+00 9.80000000e+00]
xs: [[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]
[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]
[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]
...,
[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]
[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]
[-10. -9.8 -9.6 ..., 9.4 9.6 9.8]]
ys: [[-10. -10. -10. ..., -10. -10. -10. ]
[ -9.8 -9.8 -9.8 ..., -9.8 -9.8 -9.8]
[ -9.6 -9.6 -9.6 ..., -9.6 -9.6 -9.6]
...,
[ 9.4 9.4 9.4 ..., 9.4 9.4 9.4]
[ 9.6 9.6 9.6 ..., 9.6 9.6 9.6]
[ 9.8 9.8 9.8 ..., 9.8 9.8 9.8]]
numpy 수학함수 (0) | 2017.12.02 |
---|---|
numpy 함수 (0) | 2017.12.02 |
window에서 패키지 설치 에러 해결하기 (0) | 2017.11.21 |
python 가상환경 (0) | 2017.11.21 |
파이썬 내장함수 (0) | 2017.11.20 |
Windows에서 pip로 패키지를 설치할 때 에러가 발생하는 경우가 많습니다. 예를 들어 다음은 notebook 패키지를 설치할 때 의존 패키지 중 MarkupSafe에서 에러가 난 상황입니다. 에러 메시지를 잘 보면 "Running setup.py install for MarkupSafe ..." 부분이 error로 표시됩니다.
C:₩Users₩dojang>pip install notebook ...생략... Running setup.py install for simplegeneric ... done Running setup.py install for pandocfilters ... done Running setup.py install for MarkupSafe ... error Exception: Traceback (most recent call last): ...생략... UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 68: invalid start byte
이 문제를 해결하려면 MarkupSafe 패키지를 Windows 전용으로 만든 whl 파일을 설치해야 합니다. 먼저 웹 브라우저를 실행하고 다음 주소로 이동합니다.
웹 사이트가 열리면 Ctrl+F를 눌러서 방금 에러가 발생했던 패키지인 MarkupSafe를 검색합니다. 그다음에 MarkupSafe가 나오면 링크를 클릭합니다.
링크를 클릭하면 MarkupSafe 패키지 항목으로 이동합니다. 여기에 MarkupSafe 패키지의 whl 파일들이 있는데 자신의 파이썬 버전과 비트수에 맞는 whl 파일을 다운로드합니다.
whl 파일은 패키지이름-패키지버전-파이썬버전-ABI태그-플랫폼태그.whl 형식으로 되어 있습니다. 예를 들어 cp36과 cp36m은 파이썬 3.6이라는 뜻이고, win32는 32비트 Windows, win_amd64는 64비트 Windows라는 뜻입니다(이후 새 파이썬 버전이 나오면 해당 버전에 맞춰서 새 whl 파일이 올라옵니다).
현재 설치된 파이썬의 버전을 확인하려면 명령 프롬프트(PowerShell)에서 python -V를 입력합니다.
C:₩Users₩dojang>python -V Python 3.6.0
그리고 파이썬 비트수를 확인하려면 파이썬 셸에서 다음과 같이 실행합니다.
파이썬이 32비트일 경우
>>> import platform >>> platform.architecture() ('32bit', 'WindowsPE')
파이썬이 64비트일 경우
>>> import platform >>> platform.architecture() ('64bit', 'WindowsPE')
여기서는 파이썬 버전 3.6에 32비트라고 가정하고 MarkupSafe-1.0-cp36-cp36m-win32.whl을 받아서 설치하겠습니다(MarkupSafe의 버전은 시간이 지나면 달라질 수 있습니다). 받은 whl 파일을 설치하기 전에 앞에서 설치할 때 에러가 발생한 MarkupSafe 패키지를 삭제합니다.
C:₩Users₩dojang>pip uninstall -y MarkupSafe Uninstalling MarkupSafe-1.0: Successfully uninstalled MarkupSafe-1.0
이제 pip로 whl 파일을 설치 해줍니다(파일을 다운로드한 경로는 C:₩Users₩dojang₩Downloads라고 가정).
C:₩Users₩dojang>pip install C:₩Users₩dojang₩Downloads₩MarkupSafe-1.0-cp36-cp36m-win32.whl Processing c:\users₩dojang\downloads₩markupsafe-1.0-cp36-cp36m-win32.whl Installing collected packages: MarkupSafe Successfully installed MarkupSafe-1.0
여기서 끝이 아닙니다. 처음에 notebook 패키지를 설치하던 중간에 에러가 발생했으므로 notebook 패키지가 완전히 설치되지 않았습니다. 따라서 다음과 같이 notebook 패키지를 다시 설치해줍니다.
C:₩Users₩dojang>pip install notebook Collecting notebook ...생략... Installing collected packages: jinja2, mistune, nbconvert, notebook Successfully installed jinja2-2.9.6 mistune-0.7.4 nbconvert-5.1.1 notebook-5.0.0
whl 파일로 MarkupSafe 패키지를 설치해 놓았으므로 notebook 패키지를 설치할 때 에러가 발생하지 않습니다. 이런 방식으로 Windows에서 pip로 패키지를 설치할 때 에러가 발생하는 문제를 해결할 수 있습니다.
numpy 함수 (0) | 2017.12.02 |
---|---|
numpy meshgrid (0) | 2017.12.02 |
python 가상환경 (0) | 2017.11.21 |
파이썬 내장함수 (0) | 2017.11.20 |
비트 연산자 사용하기 (0) | 2017.11.20 |
파이썬을 사용하다 보면 pip로 패키지를 설치하게 되는데 이 패키지들은 파이썬 설치 폴더(디렉터리)의Lib/site-packages 안에 저장됩니다. 그래서 pip로 설치한 패키지는 모든 파이썬 스크립트에서 사용할 수 있게 됩니다. 평소에는 이런 방식이 큰 문제가 없지만 프로젝트 여러 개를 개발할 때는 패키지의 버전 문제가 발생합니다.
예를 들어 프로젝트 A에서는 패키지X 1.5를 사용해야 하고, 프로젝트 B에서는 패키지X 2.0을 사용해야 하는 경우가 생깁니다. 이 패키지X 1.5와 2.0은 호환이 되지 않는다면 개발하기가 상당히 불편해집니다.
이런 문제를 해결하기 위해 파이썬에서는 가상 환경(virtual environment)을 제공하는데, 가상 환경은 독립된 공간을 만들어주는 기능입니다. 가상 환경에서 pip로 패키지를 설치하면 가상 환경 폴더(디렉터리)의 Lib/site-packages 안에 패키지를 저장해줍니다. 즉, 프로젝트 A와 B 각각 가상 환경을 만들어서 프로젝트 A에는 패키지X 1.5를 설치하고, 프로젝트 B에는 패키지X 2.0을 설치합니다. 이렇게 하면 파이썬 스크립트를 실행할 때도 현재 가상 환경에 설치된 패키지를 사용하므로 버전 문제가 발생하지 않습니다.
특히 가상 환경에는 파이썬 실행 파일(인터프리터) 자체도 포함되므로 각 가상 환경 별로 다른 버전의 파이썬 인터프리터가 들어갈 수 있습니다. 즉, 스크립트를 실행할 때는 원래 설치된 파이썬 인터프리터가 아닌 가상 환경 안의 파이썬 인터프리터를 사용합니다.
그럼 가상 환경을 만드는 방법을 알아보겠습니다. 가상 환경은 venv 모듈에 가상 환경 이름을 지정해서 만듭니다.
venv는 파이썬 3.3이상부터 사용 가능
여기서는 C:₩project 폴더 아래에 가상 환경을 만들겠습니다. 다음과 같이 명령 프롬프트에서 example 가상 환경을 만들고 example 폴더 안으로 이동합니다. 그다음에 Scripts 폴더 안의 activate.bat 파일을 실행하면 가상 환경이 활성화됩니다.
Windows 명령 프롬프트
C:₩project>python -m venv example C:₩project>cd example C:₩project₩example>Scripts₩activate.bat (example) C:₩project₩example>
Windows PowerShell에서는 Activate.ps1 파일을 실행합니다.
Windows PowerShell
PS C:₩project> python -m venv example PS C:₩project> cd example PS C:₩project₩example> .₩Scripts₩Activate.ps1 (example) PS C:₩project₩example>
프롬프트 앞을 보면 (example)과 같이 가상 환경 이름이 표시됩니다. 이 상태에서 pip로 패키지를 설치하면 C:₩project₩example₩Lib₩site-packages 안에 패키지가 저장됩니다. 또한, 이 상태에서 스크립트 파일을 실행하면 현재 가상 환경 안에 있는 파이썬 인터프리터와 패키지를 사용합니다.
(example) C:₩project₩example>pip install numpy (example) C:₩project₩example>dir ₩B Lib₩site-packages easy_install.py numpy numpy-1.12.1.dist-info pip pip-9.0.1.dist-info pkg_resources setuptools setuptools-28.8.0.dist-info __pycache__
가상 환경에 설치된 패키지는 목록을 저장해 두었다가 나중에 다시 설치할 수 있습니다. 다음과 같이 pip freeze로 패키지 목록과 버전 정보를 requirements.txt 파일에 저장합니다(git 등으로 버전 관리를 할 때 저장소에 설치된 패키지를 모두 추가하지 않고, requirements.txt 파일만 관리하면 됩니다).
(example) C:↷project₩example>pip freeze > requirements.txt
requirements.txt 파일의 내용대로 패키지를 설치하려면 pip install에서 -r 또는 --requirement 옵션을 사용합니다.
(example) C:₩project₩example>pip install -r requirements.txt
만약 가상 환경 별로 파이썬 인터프리터 버전을 다르게 만들고 싶다면 해당 버전의 파이썬 인터프리터로 venv 모듈을 실행하면 됩니다. 다음은 파이썬 3.4를 사용하는 가상 환경을 만듭니다(파이썬 3.4를 설치했다고 가정).
C:↷project>C:₩Python34₩python.exe -m venv example3
이렇게 하면 venv 모듈을 실행한 파이썬 실행 파일(인터프리터)이 가상 환경 안에 들어갑니다.
이번에는 macOS와 리눅스에서 가상 환경을 만드는 방법입니다. 다음과 같이 python3으로 venv 모듈을 실행여 가상 환경을 만들고, source로 bin 디렉터리 안의 activate 파일을 적용하여 가상 환경을 활성화합니다.
macOS, 리눅스
~$ python3 -m venv example ~$ cd example ~/example$ source bin/activate (example) ~/example$
가상 환경을 사용할 때 주의할 점이 있는데, 가상 환경을 만들고 나서 폴더(디렉터리)를 다른 곳으로 이동시키면 활성화가 안 됩니다. 왜냐하면 가상 환경을 활성화하는 activate.bat, Activate.ps1, activate 파일 안에 현재 가상 환경 폴더의 경로가 내장되어 있기 때문입니다. 만약 가상 환경 폴더를 다른 곳으로 이동시켰다면 activate.bat, Activate.ps1, activate 파일 안의 VIRTUAL_ENV 부분을 적절하게 수정해줍니다.
참고로 가상 환경을 사용하는 IDLE을 실행하려면 가상 환경을 활성화 시킨 뒤 idlelib 모듈을 실행하면 됩니다. 이렇게 하면 IDLE에서도 현재 가상 환경의 패키지를 사용할 수 있습니다.
Windows
(example) C:₩project₩example>pythonw.exe -m idlelib
macOS, 리눅스
(example) ~/example$ python3 -m idlelib
아나콘다는 아나콘다 전용 가상 환경을 제공하며 conda를 사용하여 가상 환경을 만듭니다. conda는 아나콘다 설치 폴더의 Scripts 안에 들어있습니다.
C:₩project>C:₩Users₩dojang₩Anaconda3₩Scripts₩conda.exe create --name example
conda는 가상 환경을 현재 폴더에 생성하지 않고 아나콘다 설치 폴더의 envs 안에 생성합니다.
예) C:₩Users₩dojang₩Anaconda3₩envs₩example
가상 환경을 활성화할 때는 아나콘다 설치 폴더의 Scripts₩activate에 가상 환경 이름을 지정하여 실행해야 합니다.
C:₩project>C:₩Users₩dojang₩Anaconda3₩Scripts₩activate example (example) C:₩project>
아나콘다 가상 환경에 패키지를 설치할 때는 pip 대신 conda를 사용해야 합니다. 만약 pip를 사용하면 아나콘다 설치 폴더의 Lib/site-packages 안에 패키지가 저장되므로 주의해야 합니다.
(example) C:₩project>conda install numpy
다음은 conda의 주요 명령입니다.
현재 환경 정보 출력: conda info
패키지 검색: conda search 패키지
특정 버전의 패키지를 설치:
conda install 패키지=버전 (예: conda install numpy=1.11.3)
conda install 패키지=버전=파이썬버전 (예: conda install numpy=1.11.3=py36_0)
패키지 업데이트: conda update 패키지
패키지 목록 출력: conda list
패키지 삭제: conda remove 패키지
패키지 목록 및 버전 정보 저장: conda list --export > package-list.txt
패키지 목록으로 설치: conda install --file package-list.txt
https://dojang.io/mod/page/view.php?id=1168
numpy meshgrid (0) | 2017.12.02 |
---|---|
window에서 패키지 설치 에러 해결하기 (0) | 2017.11.21 |
파이썬 내장함수 (0) | 2017.11.20 |
비트 연산자 사용하기 (0) | 2017.11.20 |
주피터 노트북 한글 폰트 설정 (0) | 2017.11.20 |
함수 | 설명 |
abs(숫자) | 숫자의 절댓값을 반환 |
all(반복가능한객체) | 반복 가능한 객체의 요소가 모두 참이면 True, 하나라도 거짓이면 False 예) all([1, 2, 3])은 True, all([1, 0, 3])은 False |
any(반복가능한객체) | 반복 가능한 객체의 요소가 하나라도 참이면 True, 모두 거짓이면 False 예) any([1, 0, 0])은 True, any([0, 0, 0])은 False |
bin(정수) | 정수를 2진수로 된 문자열로 만들어서 반환 |
bool(값) | 값을 True, False로 변환하여 반환. 0이 아닌 숫자, 내용이 있는 객체는 True를 반환, 0, None, 비어있는 객체는 False를 반환 |
bytes(값, 인코딩) | 바이트 객체를 반환, bytes는 바이트 단위(8비트)로 문자열을 저장하는 자료형 예) bytes('안녕', encoding='utf-8')은 b'\xec\x95\x88\xeb\x85\x95' |
chr(코드값) | ASCII 코드값에 해당하는 문자를 반환. 예) chr(97)은 'a' |
dict(반복가능한객체) | 반복 가능한 객체로 딕셔너리를 생성하여 반환 |
dir(객체) | 객체의 네임스페이스를 반환, 객체를 지정하지 않으면 현재 네임스페이스를 반환 |
divmod(a, b) | 두 숫자의 몫과 나머지를 튜플로 반환 |
enumerate | 객체에 들어있는 요소의 순서(인덱스)와 요소를 튜플로 묶어서 enumerate 객체를 반환 예) list(enumerate(['a', 'b', 'c']))는 [(0, 'a'), (1, 'b'), (2, 'c')] |
eval(문자열) | 문자열 형태의 파이썬 코드를 실행하고 결과를 반환(문자열을 파이썬 인터프리터에서 실행). 예) eval('print(1, 2)')는 1 2 출력 |
filter(함수, 반복가능한객체) | 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져옴 예) list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4]))는 [2, 4] |
float(값) | 숫자나 문자열을 실수로 변환하여 반환 |
help(객체) | 객체의 이름, 매개변수, 독스트링(__doc__ 속성)을 도움말 형태로 출력 |
hex(정수) | 정수를 16진수로 된 문자열로 만들어서 반환 |
id(객체) | 객체의 고유한 값을 반환(CPython에서는 메모리 주소) |
input(문자열) | 사용자의 입력을 받아서 문자열을 반환 |
int(값) | 숫자나 문자열을 정수로 변환하여 반환, int(문자열, 진법)은 해당 진법으로 된 문자열을 10진수로 변환하여 반환 |
isinstance(객체, 클래스) | 객체가 클래스의 인스턴스인지 확인, 클래스의 인스턴스가 맞으면 True, 아니면 False |
issubclass(파생클래스, 기반클래스) | 클래스가 특정 클래스의 파생 클래스인지 확인, 파생 클래스가 맞으면 True, 아니면 False |
iter(객체) | 객체에서 이터레이터를 반환. 객체의 __iter__ 메서드를 호출해줌 |
len(객체) | 객체의 길이(요소 개수)를 반환 |
list(반복가능한객체) | 반복 가능한 객체로 리스트를 생성하여 반환 |
map(함수, 반복가능한객체) | 반복 가능한 객체의 요소를 지정된 함수로 처리한 뒤 map 객체를 반환 예) list(map(lambda x: x + 10, [1, 2]))는 [11, 12] |
min(반복가능한객체) max(반복가능한객체) | min은 반복 가능한 객체의 요소 중에서 가장 작은 요소를 반환, max는 반복 가능한 객체의 요소 중에서 가장 큰 요소를 반환 |
next(이터레이터) | 이터레이터에서 요소를 차례대로 가져와서 반환, 이터레이터의 __iter__ 메서드를 호출해줌 |
oct(정수) | 정수를 8진수로 된 문자열로 만들어서 반환 |
open(파일이름, 파일모드) | 지정된 파일을 열어서 파일 객체를 반환, encoding을 지정하면 파일을 해당 인코딩으로 처리(텍스트 모드에만 적용됨) 예) open('hello.txt', 'w', encoding='utf-8')은 파일의 인코딩을 UTF-8로 저장 |
ord(문자) | 문자의 ASCII 코드를 반환. 예) ord('a')는 97 |
pow(값, 지수) | 값을 지수만큼 거듭제곱한 값을 반환 |
range(횟수) | 지정된 횟수만큼 숫자를 생성하는 반복 가능한 객체를 반환, range(시작, 끝, 증가폭)처럼 숫자의 범위와 증가폭을 지정할 수 있음 |
repr(객체) | 파이썬 인터프리터에서 실행할 수 있는 문자열을 반환. repr에서 반환된 문자열은 eval로 실행할 수 있음 |
reversed(반복가능한객체) | 반복 가능한 객체에서 요소의 순서를 뒤집어서 반환 |
set(반복가능한객체) | 반복 가능한 객체로 세트를 생성하여 반환 |
sorted(반복가능한객체) | 반복 가능한 객체의 요소를 오름차순 정렬하여 반환, reversed=True를 지정하면 내림차순 정렬 예) sorted([8, 5, 2])는 [2, 5, 8] |
str(값) | 값을 문자열로 변환하여 반환 |
super() | 현재 클래스의 기반 클래스 객체를 반환 |
sum(반복가능한객체) | 반복 가능한 객체에 들어있는 모든 요소의 합을 반환 |
tuple(반복가능한객체) | 반복 가능한 객체로 튜플을 생성하여 반환 |
type(객체) | 객체의 클래스(자료형) 객체를 반환. type('클래스이름', 기반클래스튜플, 속성메서드딕셔너리)는 클래스 객체를 생성하여 반환 |
zip(반복가능한객체, ...) | 같은 개수로 된 반복 가능한 객체를 여러 개 넣으면 순서대로 각 요소를 튜플로 묶어서 zip 객체를 반환 예) list(zip([1, 2, 3], [97, 98, 99]))는 [(1, 97), (2, 98), (3, 99)] |
window에서 패키지 설치 에러 해결하기 (0) | 2017.11.21 |
---|---|
python 가상환경 (0) | 2017.11.21 |
비트 연산자 사용하기 (0) | 2017.11.20 |
주피터 노트북 한글 폰트 설정 (0) | 2017.11.20 |
[Python] 버전2에서 버전3으로 옮겨갈 때 주의 점 들 (0) | 2017.11.06 |
컴퓨터는 2진수(0과 1)를 사용하므로 대부분의 프로그래밍 언어는 2진수를 다루는 연산자를 제공합니다. 그런데 2진수로 변환하는 방법을 잘 모른다면 어떻게 해야 할까요? 걱정하지 않아도 됩니다. 파이썬에서는 간단하게 2진수와 10진수를 서로 변환할 수 있습니다.
다음과 같이 10진수를 2진수로 된 문자열로 변환할 때는 bin을 사용합니다. 반대로 2진수에서 10진수로는 입력 즉시 변환됩니다. 만약 2진수가 문자열 형태라면 int에 문자열과 2를 지정하여 10진수로 변환할 수 있습니다. 그리고 코드에서 2진수를 직접 입력할 때는 맨 앞에 0b를 붙입니다(binary의 b).
>>> bin(13) # 10진수 13을 2진수로 변환 '0b1101' >>> 0b1101 # 2진수 1101을 10진수로 변환 13 >>> int('1101', 2) # 2진수로 된 문자열 1101을 10진수로 변환 13
10진수 13을 2진수로 표현하면 1101이 됩니다. 여기서 2진수의 자릿수는 일정한 값을 가지는데 낮은 자릿수부터 2의 거듭제곱 순서로 커집니다(20부터 시작). 따라서 1101은 8, 4, 1이 위치한 자릿수가 1이므로 8 + 4 + 1 = 13입니다.
이제 2진수의 각 자릿수를 AND, OR, XOR, NOT 연산을 하는 비트 논리 연산자를 사용해보겠습니다.
>>> bin(0b1101 & 0b1001) # 비트 AND '0b1001' >>> 13 & 9 # 비트 AND 9 >>> bin(0b1101 | 0b1001) # 비트 OR '0b1101' >>> 13 | 9 # 비트 OR 13 >>> bin(0b1101 ^ 0b1001) # 비트 XOR '0b100' >>> 13 ^ 9 # 비트 XOR 4 >>> bin(~0b1101) # 비트 NOT '-0b1110' >>> ~13 # 비트 NOT -14
먼저 &, |, ^, ~ 연산자로 각 비트를 연산했을 때의 결과(진리표)는 다음과 같습니다. 진리표의 내용이 많아 보여도 각 연산자의 특성만 이해하면 진리표 전체를 외우지 않아도 됩니다.
연산자 | 비트1 | 비트2 | 결과 |
& | 0 | 0 | 0 |
0 | 1 | 0 | |
1 | 0 | 0 | |
1 | 1 | 1 | |
| | 0 | 0 | 0 |
0 | 1 | 1 | |
1 | 0 | 1 | |
1 | 1 | 1 | |
^ | 0 | 0 | 0 |
0 | 1 | 1 | |
1 | 0 | 1 | |
1 | 1 | 0 | |
~ | 0 |
| 1 |
1 |
| 0 |
예를 들어 & 연산자는 비트 AND이므로 두 값이 모두 1일 때 1입니다. 따라서 하나라도 0이면 0이 나옵니다. 즉, 0b1101과 0b1001을 비트 AND 연산했을 때 0 & 1은 0 그리고 1 & 1은 1이 나오므로 0b1001이 됩니다. 10진수로 표현하면 13 & 9는 9가 되겠죠?
>>> bin(0b1101 & 0b1001) 0b1001 >>> 13 & 9 9
다음과 같이 비트 논리 연산자는 각 자릿수를 연산하여 결과를 만듭니다. 이때 각 자릿수의 연산 결과는 다른 자릿수에 영향을 미치지 않습니다.
이번에는 비트의 위치를 이동시키는 시프트 연산자입니다. 시프트 연산자는 << 또는 >> 다음에 비트를 이동시킬 횟수를 지정합니다. <<는 비트를 왼쪽으로 이동시키고, >>는 비트를 오른쪽으로 이동시킵니다.
>>> 0b0011 << 2 # 비트를 왼쪽으로 2번 이동 12 >>> bin(12) '0b1100' >>> 0b1100 >> 2 # 비트를 오른쪽으로 2번 이동 3 >>> bin(3) '0b11'
참고로 비트를 오른쪽으로 이동시켰을 때 1이 들어갈 공간이 없다면 1은 사라집니다. 즉, 계속 비트를 오른쪽으로 이동시키면 1은 모두 사라지고 최종 결과는 0b0이 됩니다.
다음은 파이썬의 비트 연산자입니다.
연산자 | 기능 | 문법 | 설명 |
& | 비트 AND | a & b | a와 b의 비트를 AND 연산 |
| | 비트 OR | a | b | a와 b의 비트를 OR 연산 |
^ | 비트 XOR | a ^ b | a와 b의 비트를 XOR 연산(배타적 OR, Exclusive OR) |
~ | 비트 NOT | ~x | x의 비트를 뒤집음 |
<< | 비트 왼쪽 시프트 | a << b | a의 비트를 b번 왼쪽으로 이동시킴 |
>> | 비트 오른쪽 시프트 | a >> b | a의 비트를 b번 오른쪽으로 이동시킴 |
&= | 비트 AND 연산 후 할당 | a &= b | a와 b의 비트를 AND 연산한 후 결과를 a에 할당 |
|= | 비트 OR 연산 후 할당 | a |= b | a와 b의 비트를 OR 연산한 후 결과를 a에 할당 |
^= | 비트 XOR 연산 후 할당 | a ^= b | a와 b의 비트를 XOR 연산한 후 결과를 a에 할당 |
<<= | 비트 왼쪽 시프트 후 할당 | a <<= b | a의 비트를 b번 왼쪽으로 이동시킨 후 결과를 a에 할당 |
>>= | 비트 오른쪽 시프트 후 할당 | a >>= b | a의 비트를 b번 오른쪽으로 이동시킨 후 결과를 a에 할당 |
https://dojang.io/mod/page/view.php?id=1160
python 가상환경 (0) | 2017.11.21 |
---|---|
파이썬 내장함수 (0) | 2017.11.20 |
주피터 노트북 한글 폰트 설정 (0) | 2017.11.20 |
[Python] 버전2에서 버전3으로 옮겨갈 때 주의 점 들 (0) | 2017.11.06 |
Python의 Generator와 yield 키워드 (0) | 2017.10.29 |
font_name = mpl.font_manager.FontProperties(fname='C:\Windows/Fonts/malgun.ttf').get_name()
mpl.rc('font', family=font_name)
파이썬 내장함수 (0) | 2017.11.20 |
---|---|
비트 연산자 사용하기 (0) | 2017.11.20 |
[Python] 버전2에서 버전3으로 옮겨갈 때 주의 점 들 (0) | 2017.11.06 |
Python의 Generator와 yield 키워드 (0) | 2017.10.29 |
가상 환경을 사용한 Python 설치 - Virtualenv, autoenv (0) | 2017.10.28 |
파이썬이 1990년 말에 만들어 졌다고 알고 있습니다.
비트 연산자 사용하기 (0) | 2017.11.20 |
---|---|
주피터 노트북 한글 폰트 설정 (0) | 2017.11.20 |
Python의 Generator와 yield 키워드 (0) | 2017.10.29 |
가상 환경을 사용한 Python 설치 - Virtualenv, autoenv (0) | 2017.10.28 |
python 토근처리 (0) | 2017.10.27 |