반응형
반응형

@Value("\${어쩌구저쩌구}")

반응형

'Program > JAVA' 카테고리의 다른 글

@TestInstance  (0) 2023.10.27
반응형

 

python -m pytest

반응형

'Program > Python' 카테고리의 다른 글

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)

 

테스트 인스턴스 단위를 클래스로 설정하자.

 

테스트는 메소드 단위이기에...

반응형

'Program > JAVA' 카테고리의 다른 글

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에 그대로 할당된것을 볼 수 있죠.

반응형

'Program > Python' 카테고리의 다른 글

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: 웹 개발자가 한달만에 앱 출시하기

사례

  • 페이스북
  • 인스타그램
  • 디스코드
  • 케이크
    • 앱개발자 1명
    • 안드로이드 & iOS 개발기간 1달
    • 매달 정기 업데이트
    • 기존 앱 개발 방식이었다면 가능했을까?

선택의결과

  • 투입한 개발 리소스 ↓ = 최종 결과물의 퀄리티 ↑
  • 플랫폼간 공유 코드 ↑ = QA & 유지 보수 비용 ↓

빠른 개발 -> 코드 공유 -> 쉬운 개선

React Native는 단 기간에 프로덕션 레벨의 크로스 플랫폼 앱을 만들어야 할 때 고려할 수 있는 여러 선택지 중 가장 가성비가 좋은 프레임워크다.

react-native 완벽한 이해

React Component -> React Native -> Bridge -> Android, iOS

Threading Structure

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 모니터링

  • MessageQueue 모니터링 방법

import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue'; MessageQueue.spy(true); MessageQueue.spy((info) => console.log("I'm spying!", info));

react-native의 발전방향

Facebook의 개선 방향

  1. New Threading model
  2. New async rendering capabilities
  3. Faster and more lightweight bridge

Cake 프로젝트에 얻은 노하우 &

EXPO(CRNA) 사용 자제

  1. 시작만 쉽고 모든 게 어려워짐
  2. 기본으로 제공하는 기능은 많지만 앱이 너무 커짐 (기본 25~30MB)
  3. 추가적인 Native 모듈을 설치할 수 없음 (제일 큰 이유!)

속 편하게 처음부터 빌드 방식(react-native-cli)으로 시작해라

효율적인 작업 순서

기본적인 작업 (레이아웃, 데이터 연동) -> 복잡한 애니메이션 & 인터랙션 확인 -> iOS에 특화된 UX 작업

중간에 안드로이드에서 확인하지 않으면 나중에 놀랄 수 있음!

Import 경로 지옥 탈출

상대경로 말고 절대경로를 사용하고 싶다면 babel-plugin-root-import를 적용

Optional Chaining

// 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 버전부터 가능)

Lock dependencies

잘못된 라이브러리 업데이트는 고통을 불러옴

버전 고정하는 방법

  1. 설치마다 고정 버전으로 설치하기

$ npm install --save --save-exact react-native-fbsdk $ yarn add --exact react-native-fbsdk

  1. 전역 기본 옵션으로 설정하기

$ npm config set save-exact=true

Flow는 처음부터 꼭 사용해라

Flow를 적용해서 타입을 정의하면 파라미터 타입 오류의 사전 감지가 가능

  1. 코드 진단
  2. 자동 완성
  3. 타입 힌트
  4. 빠른 함수 이동

요즘은 타입스크립트도 지원이 많이 되어서 괜찮음

컴파일된 번들 파일 확인

자신이 짠 코드를 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 사용하기

  1. 기존 Native 개발 방식(Xcode asset catalogs / Android drawable folder)으로 추가
  2. 크기 속성을 꼭 정의

성능을 고려한 리모트 이미지 사용

내장 Image 컴포넌트의 문제

  1. Flickering
  2. Cache misses
  3. Low performances

// SDWebImage (iOS) / Glide (Android) 라이브러리 사용으로 문제점 개선 $ npm install react-native-fast-image

JavaScriptCode의 동작 오류

  • Remote Debug 모드는 크롬의 V8 엔진 사용 (JavaScriptCore 엔진은 Date 처리에 문제가 많으므로 moment.js 라이브러리 사용)
  • 플랫폼 간에도 다르게 동작할 수 있음 (안드로이드는 오래된 버전의 JavaScriptCore 엔진 사용중임)

플랫폼별 컴포넌트 스타일링

  • 재정의 방식으로 스타일 정의하기

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;

편리한 Style 자동완성

  • atom-react-native-style 패키지 설치

안드로이드 Text 위 아래 패딩 제거

  • includeFontPadding 스타일 속성 끄기 (iOS와 동일하게 TextView의 ascent, descent 기준으로 출력)

공용 Text 컴포넌트 사용하기

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>; } }

터치 영역 확장하기

  • hitSlop으로 최소한 44dp의 터치 영역을 보장해주세요.

<TouchableWithourFeedback hitSlop={{top: 7, right: 7, bottom: 7, left: 7}}> <View .../> </TouchableWithourFeedback>

놓치기 쉬운 최초 화면 렌더링

  • render() 함수가 최초에 한 번 실행된다는 걸 잊기 쉬움
  • render() -> componentDidMount() -> render()
  • 출력 여부 상태 값으로 불필요한 초기 렌더링 제거

화면에 보이지 않지만 동작하는 코드

  • 타이머/이벤트 리스너 사용 시 꼭 제거

개발자 도구

  • react-native: Perf Monitor(iOS)
  • Xocde: View Hierarchy Debugger
  • Android Studio: Profiler

60 FPS 보장하기

효율적인 애니메이션 사용

  • Javascript Driver 동작 순서

requestAnimationFrame 함수 실행 -> 값 계산 후 View.setNativeProps 함수 실행 -> Bridge로 전달 -> UI 업데이트

  • Native Driver 동작 순서

메인 쓰레드에서 프레임마다 실행 -> 계산된 값으로 직접 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 속성 사용

높이가 고정된 구성이라면 레이아웃의 크기를 매번 계산하지 않아서 성능 개선

<FlatList getItemLayout={(data, index) => { { length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index } )} />

효율적인 레퍼런스 사용

  1. String Refs

Deprecated된 방식으로 사용하지 마세요.

// 레퍼런스 할당 <TextInput ref={'inputField'} /> // 레퍼런스 사용 this._refs.inputField.focus();

  1. Callback Refs

컴포넌트에 인라인 함수를 사용하는 건 좋지 않아요.

// 레퍼런스 할당 <TextInput ref={ component => this._inputField = component } /> // 레퍼런스 사용 this._inputField.focus();

  1. React.createRef()

React 16.3 버전부터 제공하는 효율적인 방식을 사용하세요.

// 레퍼런스 생성 this._inputFieldRef = React.createRef(); // 레퍼런스 할당 <TextInput ref={this._inputFieldRef} /> // 레퍼런스 사용 this._inputFieldRef.current.focus();

Google Play API Level 26 정책 대응

  • 유지보수되지 않는 라이브러리의 빌드 설정

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) } }

안드로이드 APK 최적화

  1. Split APK
  • CPU 별로 불필요한 코드 제거
  • 중복된 JavaScriptCore 라이브러리의 제거로 APK 크기 3~4 MB 감소

// android/app/build.gradle def enableSeparateBuildPerCPUArchitecture = true

  1. Proguard 적용

// android/app/build.gradle def enableProguardInReleaseBuilds = true

  1. shrinkResources 옵션 사용 금지
  2. console.* 코드 제거

$ npm install --save-dev babel-plugin-transform-remove-console

// .babelrc { "env": { "production": { "plugins": ["transform-remove-console"] } } }

  1. 불필요한 localized resource 제거

// android/app/build.gradle android { defaultConfig { resConfigs "en", "ko" } }

  1. 이미지 최적화

TinyPNG, OptiPNG

앱 크기에 대한 걱정은 오해

네비게이션 모듈 선택

  • react-navigation (JS 구현체)
  • react-native-navigation (Native 구현체)
  • Native 구현체가 JS 구현체보다 성능이 좋으니 무조건 앞선다는 글에 현혹되지 마세요.
  • 원하는 수준의 커스터마이징과 트러블 대응이 가능한 모듈을 선택하세요.

복잡한 애니메이션은 Lottie

  • 이제 디자이너한테 복잡한 애니메이션도 다 된다고 자신 있게 말하세요.

Adobe After Effects로 작업한 애니메이션을 JSON 형식으로 export하면 끝

<LottieView source={require('./animation.json')} autoPlay loop />

출처

  • 발표자료: 링크
  • 발표자: 스노우 이성민 개발자님

도움되는 링크

반응형

'Program > ReactNative And Expo' 카테고리의 다른 글

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 *** : 리소스 경로 설정

 

반응형
반응형

설치 환경은

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]

반응형

'Program > Python' 카테고리의 다른 글

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
반응형

Jupyter를 사용하면 뭐가 좋아지나?

  • 웹브라우저에서 모든 작업이 이루어져 편리해진다.
  • 코딩과 문서화 작업을 한꺼번에 할 수 있다.
  • 매일 일기 쓰듯이 코딩 연습을 할 수 있게 자연스럽게 습관이 든다.
  • 재미있어진다.

어떻게 사용하나?

  • 온라인에서 서비스를 제공해 주는 곳에 가서 이용해도 된다.
  • 하지만 나의 데스크탑에 로컬로 설치해서 마음대로 환경을 설정해 가면서 쓰는것이 더 좋다.
  • 작업한 노트북들은 Github에 push하면서 백업 효과를 노리자.

Jupyter Notebook 설치 및 환경셋팅

  • 시스템 자체의 부하가 크지 않기 때문에 한 번 같이 올려본다.
  • 자신의 서버/컴퓨터에서 Jupyter 서비스를 온라인으로 제공하게 되면, 자신이 사용하는 PC 마다 일일이 따로따로 설치해 줘야 하는 불편함에서 벗어날 수 있다.
  • Python, Julia, Octave, Bash 커널 등을 넣어서 함께 제공하기로 한다.
  • 본 환경구축 레시피는 다음 환경에서 테스트했다.
    • 우분투 16.04 계열 리눅스 머신

Anaconda3 설치

  • Anaconda 패키지를 설치하는게 가장 손쉽다.
  • Anaconda 패키지에는, python과 과학기술용 각종 라이브러리들, 그리고 Jupyter 핵심 부분이 기본적으로 포함되어 있으며, 일반적인 python의 패키지 관리자인 pip 말고 전용 패키지 관리자인 conda도 들어있다.
  • 다운로드 사이트 : https://www.continuum.io/downloads#linux
  • 위 사이트에서 다운로드 할 버전의 주소를 복사한 다음, 아래와 같이 wget으로 NAS에 다운로드 받아도 된다.
  • 다운로드 받은 설치파일을 실행한다.
bash Anaconda3-4.2.0-Linux-x86_64.sh
  • 설치할 때 마지막에 bash 설정에 경로를 추가할지를 묻는데, 당연히 추가하도록 yes 해 준다.
  • 이제 Anaconda 패키지는 모두 ~/anaconda3 경로에 설치되어 있을 것이다. sudo 권한으로 설치한 것이 아니므로, 자신이 마음대로 삭제할 수도 있다는 점을 유의한다. 또한 앞으로 새로 추가할 패키지들 역시 sudo 권한이 불필요할 것이다.

Anaconda3 업데이트 및 셋팅

  • Anaconda의 Python 패키지들을 전부 최신버전으로 업데이트하려면 다음 명령을 쓰면 된다.
conda update conda
conda update anaconda

Jupyter를 위한 Python 환경 생성

  • 고립된 Python 환경을 생성하여면 다음과 같은 식으로 하면 된다. 본 예에서는 JUPYTER라는 이름의 Python 환경을 만들고, 그 환경을 Activate 시키는 것이다.
conda create --name JUPYTER ipython
source activate JUPYTER

Jupyter 설치

  • 기본적인 패키지는 이미 Anaconda에 들어가 있지만, 확실히 하기 위해 Jupyter 설치 명령을 준다.
conda install jupyter

Jupyter Notebook에 설치 가능한 커널

Julia 커널 설치

  • Julia 언어를 시스템에 설치하고, 이것을 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 안에서 다음 명령을 넣어서 Julia 언어에서 사용할 확률이 가장 높은 모듈들을 추가 설치한다.

Pkg.init()
Pkg.add("Jewel")
Pkg.add("Images")
Pkg.add("PyPlot")
Pkg.add("IJulia")
Pkg.update()
quit()
  • 패키지 설치 도중에 빌드 에러가 발생할 경우, 다음과 같이 의존성 있는 것들을 추가 설치해 주면 해결될 확률이 높다. (어떤 모듈의 경우에는 설치하면서 동시에 Build 작업이 진행되는 경우가 있다.)
sudo apt-get install build-essential cmake

GNU Octave 커널 설치

  • 이번에는 GNU Octave를 시스템에 설치하고, 이것을 Jupyter에서도 사용할 수 있도록 커널을 설치해 보자.
  • 저장소를 등록하고, 설치.
sudo add-apt-repository ppa:octave/stable
sudo apt-get update
sudo apt-get install octave
  • Octave 잘 실행되는지 확인
octave-cli
  • Octave GUI 실행 확인
octave
  • Octave GUI 실행 실패시 조치 (QT 설정파일 소유권을 root에서 현재 사용자로 변경) : 현행 배포한의 버그.
sudo chown -hR 계정:계정 ~/.config/octave
  • 커널 설치 (sudo 불필요)
pip install octave_kernel
python -m octave_kernel.install

Bash 커널 설치

  • 이번에는 Bash를 시스템에 설치하고, 이것을 Jupyter에서도 사용할 수 있도록 커널을 설치해 보자.
  • 커널 설치
pip install bash_kernel
python -m bash_kernel.install

C 커널 설치

  • 이번에는 C 언어를 Jupyter에서도 사용할 수 있도록 커널을 설치해 보자. C 컴파일러는 이미 시스템에 gcc로 설치되어 있으므로 컴파일러는 별도로 설치할 필요가 없다.
  • 참고 : https://github.com/brendan-rius/jupyter-c-kernel
  • C 커널 설치
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

Jupyter Notebook 작업 디렉토리 생성

  • 아무데서나 실행할 수는 없으므로, 작업할 디렉토리를 따로 만들어주는게 보안상 좋겠다. 이왕이면 Github와 연동시키기 좋도록 한다.
mkdir ~/github/My-Jupyter-Notebooks
  • Github 리모트 저장소와 연결하는 절차의 설명은 생략한다.

Jupyter Notebook을 외부망에서 접속 가능하도록 설정하기

jupyter notebook --generate-config
  • 그러면 /home/dong/.jupyter/jupyter_notebook_config.py 파일이 새로 생겨난 것을 확인.
  • 한편, 로그인을 위한 패스워드 해쉬코드를 만든다. 이와 관련된 기본적인 파이썬 함수가 있으므로, 파이썬 상태에서 이 함수를 이용해서 해쉬코드를 만든다. 우선 터미널에 python 쳐서 파이썬 REPL로 들어간 다음,
from notebook.auth import passwd
passwd()

위와 같이 명령을 때려주면 비밀번호를 치라고 나오는데 확인차 2번 쳐 주면 해쉬코드로 된 비밀번호 코드가 나온다. 해쉬코드를 긁어다 복사해 두거나 메모해 둔다. 그리고 python 콘솔을 빠져나오려면

exit()
  • 설정 프로파일을 편집기로 열어서 내용 확인. (대략 500줄을 좀 넘어가는 코드이고, 대부분 주석)
nano /home/계정/.jupyter/jupyter_notebook_config.py
  • 편집기에서 다음 내용으로 해당 부분을 수정해 준다. 이중에서 포트 번호는 원하는걸로 바꾸면 되지만, 여기서는 8888로 하자. 각 행의 맨 앞에 주석기호 #의 유무를 잘 비교해서 확인하자.
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
  • 자동으로 웹브라우저가 실행되지 않도록 하려면 이렇게 한다.
jupyter notebook --no-browser
  • 특정한 디렉토리를 루트로 삼아 실행되도록 하려면 이렇게 한다.
jupyter notebook --notebook-dir='디렉토리경로'
  • 이제 외부 컴퓨터의 웹브라우저로 다음 주소를 쳐서 들어가지는지 확인.

비밀번호 로그인, 설치된 커널의 활성화 여부 등을 확인한다.

  • 이상없이 잘 되면, 서버 터미널에서 Ctrl+cy를 쳐서 종료한다.

부팅할 때 자동으로 Jupyter Notebook 실행되도록 설정

  • 개인 서버에서 돌리려면 이런식으로 자동 스타트 설정을 해 주면 편리할 것이다.
  • 쉘 스크립트를 편집해서 만든다.
nano ~/Start_Jupyter.sh

한 다음 다음 내용을 써 넣고 저장 후 종료.

#!/bin/bash
/home/계정/anaconda3/bin/jupyter notebook &
  • 만든 쉘 스크립트를 실행 가능하도록 속성을 준다.
chmod +x ~/Start_Jupyter.sh
  • 다음과 같이 rc.local 파일을 열어서 편집한다.
sudo nano /etc/rc.local
  • 다음 내용을 추가한 후 저장하고 편집기 종료.
sudo -u 계정 /home/계정/Start_Jupyter.sh
  • 서버 재부팅
sudo reboot now
  • 만일 제대로 작동을 안한다면 다음 명령을 줘 본다. (참고)
sudo systemctl enable rc-local.service

Jupyter Notebook Extensions 설치

  • Anaconda를 이용해 설치된 Jupyter Notebook에는 Anaconda 자체적인 Extension이 이미 설치되어 있다. 별다른 조치 없이 슬라이드샷으로 프리젠테이션 해 주는 기능 등이 있어 편리하다. (참고)
  • 다만 여기서는 표준적인 Jupyter Notebook Extensions를 추가로 설치 시도한다.
  • 참고 : https://github.com/ipython-contrib/jupyter_contrib_nbextensions
conda install -c conda-forge jupyter_contrib_nbextensions
  • 단, 이 익스텐션은 64비트 버전만 제공되고 32비트 버전은 제공되지 않는다. 자신의 서버/컴퓨터가 32비트라면 사용할 수 없다.

Jupyter Notebook Themes 설치

  • 여러가지 방식으로 개발된 테마들이 있지만, 다음의 것이 가장 심플하고 설치 자체도 쉬운 것 같다.
  • jupyterthemes : https://github.com/dunovank/jupyter-themes
  • 설치는 다음 한 줄이면 끝난다.
pip install jupyterthemes
  • 설치 후 적용 가능한 테마를 보기 위해 jt -l을 쳐 주면 다음과 같이 4가지 테마가 나온다.
onedork
grade3
oceans16
chesterish
  • 이 중에서 grade3가 바탕이 흰 색의 테마이고, 나머지는 어두운 색이다. 시험삼아 다음 명령을 하나씩 줘 보자.
jt -t grade3 -T -N
  • 원상복귀 하려면 jt -r을 주면 된다고 하는데, 해 봐도 원상복귀가 안된다! ㅠㅠ
  • 강제로 원상복귀 시키려면, 원래의 오리지널 css 파일을 만들어서 집어넣어주면 될 것이다.
  • ~/.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;
}

Jupyter Lab

  • 이제까지 설치해서 사용하는 환경은 바로 ‘Jupyter Notebook’이다.
  • 그런데 이 UI가 마음에 안 드는지, 한 그룹에서 새롭게 Jupyter Lab을 개발하고 있다.

JupyterLab

  • 현재 알파 릴리즈되어 설치해서 작동 시켜볼 수도 있다.
  • 다만 아직 완전하게 기능구현,최적화,버그 등을 모두 잡은 상태는 아닌 것 같다.
  • 다만 아마 1~2년 정도 지나서는 Notebook에서 Lab 환경으로 이행할 것으로 보인다.
  • JupyterLab 레포지토리
  • 개인적으로 사용해 보니 확실히 Notebook 보다 더 편리하고 기능이 더 많다.
  • conda-forge 패키지 저장소에서도 제공하고 있기 때문에 설치 방법은 간단하다.
conda install -c conda-forge jupyterlab
  • 설치 후, 다음 명령으로 실행한다.
julia lab
  • 그러면 주소는 다음과 같이 나온다.
  • 기존의 Notebook 환경이 그립다면 주소를 이렇게 바꾸면 된다.
  • 아마 당분간은 이렇게 Lab과 Notebook을 공존시키다가, Lab이 충분히 성숙되면 Notebook은 별도로 떨어뜨리기로 계획되어 있다고 한다.

결론

  • 이제 Jupyter에서 Python, C, Octave, Julia, Bash 등을 마음대로 사용할 수 있게 되었으니 가지고 놀면 된다.


반응형

'Program > Python' 카테고리의 다른 글

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]

반응형

'Program > Python' 카테고리의 다른 글

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 ~]#


반응형

'Program > Python' 카테고리의 다른 글

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())


반응형

'Program > Python' 카테고리의 다른 글

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

반응형

'Program > Python' 카테고리의 다른 글

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()



반응형

'Program > Python' 카테고리의 다른 글

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 쪼개기



반응형

'Program > Python' 카테고리의 다른 글

[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



반응형

'Program > Python' 카테고리의 다른 글

[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

반응형
반응형

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)


반응형
반응형
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)


반응형
반응형
df = pd.read_csv('./data/movie_review.csv', encoding='cp949')


반응형

'Program > Python' 카테고리의 다른 글

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
반응형
iloc : integer index, label 사용 불가

loc : label index, integer 사용 불가

ix : integer, label 둘 다 , label이 숫자라면 label-based index만 된다.


반응형

'Program > Python' 카테고리의 다른 글

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]

반응형

'Program > Python' 카테고리의 다른 글

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

반응형

'Program > Python' 카테고리의 다른 글

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
반응형
NumPy에서 배열 생성을 위한 주요 함수들은 다음과 같다.
함수 이름설명
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처럼 값을 초기화 하지는 않는다.


NumPy가 지원하는 자료형 목록은 다음과 같다.
종류Type Code설명
int8, unit8i1, u1부호가 있는 8비트 정수형과 부호가 없는 8비트 정수형
int16, unit16i2, u2부호가 있는 16비트 정수형과 부호가 없는 16비트 정수형
int32, unit32i4, u4부호가 있는 32비트 정수형과 부호가 없는 32비트 정수형
int64, unit64i8, u8부호가 있는 64비트 정수형과 부호가 없는 64비트 정수형
float16f2반정밀도 부동 소수점
float32f4 또는 f단정밀도 부동 소수점, C 언어의 float와 호환
float64f8 또는 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) 값을 계산한다.


이항 유니버설 함수는 2개의 인자를 취해서 단일 배열을 반환해주는 함수를 말한다.
함수설명
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.qrQR 분해를 계산한다.
numpy.linalg.svd특이값 분해(SVD)를 계산한다.
numpy.linalg.solveA가 정사각 행렬일 때 Ax = b를 만족하는 x를 구한다.
numpy.linalg.lstsqy = xb를 만족하는 최소 제곱해를 구한다.


다음은 numpy.random 함수에 포함되어 있는 일부분이다.
함수설명
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 )



numpy에서 제공하는 집합 함수는 다음과 같다.
함수설명
unique(x)배열 x에서 중복된 원소를 제거한 후 정렬하여 반환한다.
intersect1d(x, y)배열 x와 y에 공통적으로 존재하는 원소를 정렬하여 반환한다.
union1d(x, y)두 배열의 합집합을 반환한다.
in1d(x, y)x의 원소 중 y의 원소를 포함하는 지를 나타내는 불리언 배열을 반환한다.
setdiff1d(x, y)x와 y의 차집합을 반환한다.
setxor1d(x, y)한 배열에는 포함되지만, 두 배열 모두에는 포함되지 않는 원소들의 집합인 대칭 차집합을 반환한다.


반응형

'Program > Python' 카테고리의 다른 글

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


이것이 meshgrid


반응형

'Program > Python' 카테고리의 다른 글

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:Usersdojang>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 파일을 설치해야 합니다. 먼저 웹 브라우저를 실행하고 다음 주소로 이동합니다.

  • Python Extension Packages for Windows
    http://www.lfd.uci.edu/~gohlke/pythonlibs/

웹 사이트가 열리면 Ctrl+F를 눌러서 방금 에러가 발생했던 패키지인 MarkupSafe를 검색합니다. 그다음에 MarkupSafe가 나오면 링크를 클릭합니다.

▼ 그림 48-4 Unofficial Windows Binaries for Python Extension Packages에서 패키지 검색
그림 48 4 Unofficial Windows Binaries for Python Extension Packages에서 패키지 검색

링크를 클릭하면 MarkupSafe 패키지 항목으로 이동합니다. 여기에 MarkupSafe 패키지의 whl 파일들이 있는데 자신의 파이썬 버전과 비트수에 맞는 whl 파일을 다운로드합니다.

▼ 그림 48-5 Unofficial Windows Binaries for Python Extension Packages에서 whl 파일 받기
그림 48 5 Unofficial Windows Binaries for Python Extension Packages에서 whl 파일 받기

whl 파일은 패키지이름-패키지버전-파이썬버전-ABI태그-플랫폼태그.whl 형식으로 되어 있습니다. 예를 들어 cp36과 cp36m은 파이썬 3.6이라는 뜻이고, win32는 32비트 Windows, win_amd64는 64비트 Windows라는 뜻입니다(이후 새 파이썬 버전이 나오면 해당 버전에 맞춰서 새 whl 파일이 올라옵니다).

현재 설치된 파이썬의 버전을 확인하려면 명령 프롬프트(PowerShell)에서 python -V를 입력합니다.

C:Usersdojang>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:Usersdojang>pip uninstall -y MarkupSafe
Uninstalling MarkupSafe-1.0:
  Successfully uninstalled MarkupSafe-1.0

이제 pip로 whl 파일을 설치 해줍니다(파일을 다운로드한 경로는 C:₩Users₩dojang₩Downloads라고 가정).

C:Usersdojang>pip install C:UsersdojangDownloadsMarkupSafe-1.0-cp36-cp36m-win32.whl
Processing c:\usersdojang\downloadsmarkupsafe-1.0-cp36-cp36m-win32.whl
Installing collected packages: MarkupSafe
Successfully installed MarkupSafe-1.0

여기서 끝이 아닙니다. 처음에 notebook 패키지를 설치하던 중간에 에러가 발생했으므로 notebook 패키지가 완전히 설치되지 않았습니다. 따라서 다음과 같이 notebook 패키지를 다시 설치해줍니다.

C:Usersdojang>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로 패키지를 설치할 때 에러가 발생하는 문제를 해결할 수 있습니다.



반응형

'Program > Python' 카테고리의 다른 글

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을 설치합니다. 이렇게 하면 파이썬 스크립트를 실행할 때도 현재 가상 환경에 설치된 패키지를 사용하므로 버전 문제가 발생하지 않습니다.

▼ 그림 48-3 파이썬 가상 환경
그림 48 3 파이썬 가상 환경

특히 가상 환경에는 파이썬 실행 파일(인터프리터) 자체도 포함되므로 각 가상 환경 별로 다른 버전의 파이썬 인터프리터가 들어갈 수 있습니다. 즉, 스크립트를 실행할 때는 원래 설치된 파이썬 인터프리터가 아닌 가상 환경 안의 파이썬 인터프리터를 사용합니다.

그럼 가상 환경을 만드는 방법을 알아보겠습니다. 가상 환경은 venv 모듈에 가상 환경 이름을 지정해서 만듭니다.

venv는 파이썬 3.3이상부터 사용 가능

  • python -m venv 가상환경이름

여기서는 C:₩project 폴더 아래에 가상 환경을 만들겠습니다. 다음과 같이 명령 프롬프트에서 example 가상 환경을 만들고 example 폴더 안으로 이동합니다. 그다음에 Scripts 폴더 안의 activate.bat 파일을 실행하면 가상 환경이 활성화됩니다.

Windows 명령 프롬프트

C:project>python -m venv example
C:project>cd example
C:projectexample>Scriptsactivate.bat
(example) C:projectexample>

Windows PowerShell에서는 Activate.ps1 파일을 실행합니다.

Windows PowerShell

PS C:project> python -m venv example
PS C:project> cd example
PS C:projectexample> .ScriptsActivate.ps1
(example) PS C:projectexample>

프롬프트 앞을 보면 (example)과 같이 가상 환경 이름이 표시됩니다. 이 상태에서 pip로 패키지를 설치하면 C:₩project₩example₩Lib₩site-packages 안에 패키지가 저장됩니다. 또한, 이 상태에서 스크립트 파일을 실행하면 현재 가상 환경 안에 있는 파이썬 인터프리터와 패키지를 사용합니다.

(example) C:projectexample>pip install numpy
(example) C:projectexample>dir B Libsite-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:projectexample>pip freeze > requirements.txt

requirements.txt 파일의 내용대로 패키지를 설치하려면 pip install에서 -r 또는 --requirement 옵션을 사용합니다.

(example) C:projectexample>pip install -r requirements.txt

만약 가상 환경 별로 파이썬 인터프리터 버전을 다르게 만들고 싶다면 해당 버전의 파이썬 인터프리터로 venv 모듈을 실행하면 됩니다. 다음은 파이썬 3.4를 사용하는 가상 환경을 만듭니다(파이썬 3.4를 설치했다고 가정).

C:project>C:Python34python.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.batActivate.ps1activate 파일 안에 현재 가상 환경 폴더의 경로가 내장되어 있기 때문입니다. 만약 가상 환경 폴더를 다른 곳으로 이동시켰다면 activate.batActivate.ps1activate 파일 안의 VIRTUAL_ENV 부분을 적절하게 수정해줍니다.

참고로 가상 환경을 사용하는 IDLE을 실행하려면 가상 환경을 활성화 시킨 뒤 idlelib 모듈을 실행하면 됩니다. 이렇게 하면 IDLE에서도 현재 가상 환경의 패키지를 사용할 수 있습니다.

Windows

(example) C:projectexample>pythonw.exe -m idlelib

macOS, 리눅스

(example) ~/example$ python3 -m idlelib
참고 | 아나콘다 가상 환경 만들기

아나콘다는 아나콘다 전용 가상 환경을 제공하며 conda를 사용하여 가상 환경을 만듭니다. conda는 아나콘다 설치 폴더의 Scripts 안에 들어있습니다.

  • conda create --name 가상환경이름

C:project>C:UsersdojangAnaconda3Scriptsconda.exe create --name example

conda는 가상 환경을 현재 폴더에 생성하지 않고 아나콘다 설치 폴더의 envs 안에 생성합니다.

  • 예) C:₩Users₩dojang₩Anaconda3₩envs₩example

가상 환경을 활성화할 때는 아나콘다 설치 폴더의 Scripts₩activate에 가상 환경 이름을 지정하여 실행해야 합니다.

  • activate 가상환경이름

C:project>C:UsersdojangAnaconda3Scriptsactivate example
(example) C:project>

아나콘다 가상 환경에 패키지를 설치할 때는 pip 대신 conda를 사용해야 합니다. 만약 pip를 사용하면 아나콘다 설치 폴더의 Lib/site-packages 안에 패키지가 저장되므로 주의해야 합니다.

  • conda install 패키지

(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

반응형

'Program > Python' 카테고리의 다른 글

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])은 Trueall([1, 0, 3])은 False

any(반복가능한객체)

반복 가능한 객체의 요소가 하나라도 참이면 True, 모두 거짓이면 False

예) any([1, 0, 0])은 Trueany([0, 0, 0])은 False

bin(정수)

정수를 2진수로 된 문자열로 만들어서 반환

bool(값)

값을 TrueFalse로 변환하여 반환. 0이 아닌 숫자, 내용이 있는 객체는 True를 반환, 0None, 비어있는 객체는 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)]

반응형
반응형

컴퓨터는 2진수(0과 1)를 사용하므로 대부분의 프로그래밍 언어는 2진수를 다루는 연산자를 제공합니다. 그런데 2진수로 변환하는 방법을 잘 모른다면 어떻게 해야 할까요? 걱정하지 않아도 됩니다. 파이썬에서는 간단하게 2진수와 10진수를 서로 변환할 수 있습니다.

다음과 같이 10진수를 2진수로 된 문자열로 변환할 때는 bin을 사용합니다. 반대로 2진수에서 10진수로는 입력 즉시 변환됩니다. 만약 2진수가 문자열 형태라면 int에 문자열과 2를 지정하여 10진수로 변환할 수 있습니다. 그리고 코드에서 2진수를 직접 입력할 때는 맨 앞에 0b를 붙입니다(binary의 b).

  • bin(정수)
  • int('2진수문자열', 2)
>>> 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 연산을 하는 비트 논리 연산자를 사용해보겠습니다.

  • a & b
  • a | b
  • a ^ b
  • ~x
>>> 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

먼저 &|^~ 연산자로 각 비트를 연산했을 때의 결과(진리표)는 다음과 같습니다. 진리표의 내용이 많아 보여도 각 연산자의 특성만 이해하면 진리표 전체를 외우지 않아도 됩니다.

▼ 표 48-1 &, |, ^, ~의 연산 결과

연산자

비트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

다음과 같이 비트 논리 연산자는 각 자릿수를 연산하여 결과를 만듭니다. 이때 각 자릿수의 연산 결과는 다른 자릿수에 영향을 미치지 않습니다.

▼ 그림 48-1 비트 단위 연산
그림 48 1 비트 단위 연산

이번에는 비트의 위치를 이동시키는 시프트 연산자입니다. 시프트 연산자는 << 또는 >> 다음에 비트를 이동시킬 횟수를 지정합니다. <<는 비트를 왼쪽으로 이동시키고, >>는 비트를 오른쪽으로 이동시킵니다.

  • a << b
  • a >> b
>>> 0b0011 << 2    # 비트를 왼쪽으로 2번 이동
12
>>> bin(12)
'0b1100'
>>> 0b1100 >> 2    # 비트를 오른쪽으로 2번 이동
3
>>> bin(3)
'0b11'

참고로 비트를 오른쪽으로 이동시켰을 때 1이 들어갈 공간이 없다면 1은 사라집니다. 즉, 계속 비트를 오른쪽으로 이동시키면 1은 모두 사라지고 최종 결과는 0b0이 됩니다.

다음은 파이썬의 비트 연산자입니다.

▼ 표 48-2 파이썬 비트 연산자

연산자

기능

문법

설명

&

비트 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

반응형
반응형

font_name = mpl.font_manager.FontProperties(fname='C:\Windows/Fonts/malgun.ttf').get_name()

mpl.rc('font', family=font_name)

반응형
반응형

파이썬이 1990년 말에 만들어 졌다고 알고 있습니다.

(실제 1.0은 1994년에 나왔군요)
거의 25살 청년이 다 되었네요. 적지 않은 나이이지만,
우리나라에서는 비교적 최근에 유명해 졌다고 할 수 있습니다.
아마도 더 기본적인 것은 지금은 구글을 나왔지만 파이썬의 창시자가
구글에 몸담고 있었고 구글 API를 포함한 많은 것들이 모두 파이썬을
기본으로 시작하여 그렇지 않나 싶습니다.

심지어는 최근에 머신러닝으로 구글이 오픈한 텐서플로우 조차도 
파이썬과 C API 로만 구성되어 있는 것을 보더라도 금방 이해할 수 있습니다.

이것은 파이썬 만큼 글루 언어로서 다른 내부 블랙박스를 하이레벨에서 
핸들링하기 좋은 언어는 많지 않다는 것을 의미하는 것입니다.
파이썬 자체의 속도는 차체하고 (시간이 많이 걸릴 일들은 모두
그 하단의 블랙박스에 맡기면 됩니다) 쉽게 API를 핸들링 하고 
테스트 해 볼 수 있는 장점 등은 한번 사용해 보시면 앱니다.. ^^

제가 이런 말씀을 감히 드릴 수 있는 것은 어찌보면 25년 (곧 26년째)
개발을 하고 있는데 그동안 직접 프로덕트나 프로젝트에 이용해 왔던 언어
및 프레임워크 들:
C, C++, Motif, MFC, awk, perl, Java, C#, VB, Delphi, CGI,
PHP, ASP, JSP,...
등 중에서도 그 쓰임새가 남다르기 때문입니다.

암튼 현재 파이썬이 크게 2.7.11, 3.5.1 과 같이
2.x와 3.x가 공존하고 있습니다.

2.x가 존재하는 이유는 2008년 2.6이었을 때,
기존의 하위 호환성을 포기하는 대신 새로운 기능과
성능으로 나가겠다는 것을 표명한 상태입니다.
또한 공식 블로그 등을 보더라도 2.7.x 이후 버전은 나오지 않을 거라 들은 것 같습니다.

암튼 최근 3.5.x 도 나왔고 기존에 버전2의 것들도 필요에 따라 3으로 옮겨갈 필요가 있었습니다.

약 20개 정도의 기존에 2.7.x 용으로 작성했던 파이썬 코드와 대여섯개의
써드파티 라이브러리 등을 3.5.x 로 변경해 보았는데 대략 15개 정도의 것들만
유념하면 대부분의 경우에 이상없이 잘 동작할 수 있을 것 같았습니다.

그 시행착오를 공유해 봅니다.

1) Exception 예외처리에서 as
<<<
except OSError, e:
sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
>>>
except OSError as e:
sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)

콤마 대신 as 로 주어야 합니다.


2) file() built-in
<<<
si = file(self.stdin, 'r')
>>>
si = open(self.stdin, 'r')

file build-in 함수를 사용한 경우 open 으로 그대로 변경하면 됩니다.


3) print keyword => print build-in function
<<<
print str(err)
>>>
print(str(err))

print 함수로 변경되었기에 print 다음에 괄호가 꼭 나와야 합니다.


4) long() ==> int()

long type is just int
long type 이 없어지고 int가 long 까지 커버를 한다고 하는군요.


5) basestring => str
<<<
isinstance(obj, basestring)
>>>
isinstance(obj, str)

기존에 basestring, unicode 등이 모두 str 자체 (unicode 의미)로 의미 변경되었습니다.


6) xrange ==> range

2.x 에서는 "for i in xrange(10)" 과 같이 range 와 xrange built-in 함수가 있었습니다.
차이점은 range는 [0,1,2,...,9] list를 반환하고x xrange는 generator로서 그 안에
해당 값으로 yield 시키는 차이가 있었습니다.
3.x 에서는 2.x의 range에 해당하는 함수가 없어지고 xrange 개념의 함수가 range 라고
되어 버렸습니다.
따라서 xrange 라고 되어 있던 부분은 그냥 range 라고 변경만 해 주면 됩니다.


7) byte array is not str

TypeError: a bytes-like object is required, not 'str'

>>> print(b'abcde' == 'abcde')
False
>>> print(b'abcde'.decode() == 'abcde')
True

2.x 에 없던 b'abcde' 라는 바이트 스트림 문자열 상수(리터럴)이 존재합니다.
암복호화를 비록하여 아주 많은 함수들이 기존 문자열 대신 이 바이트 스트림을 
패러미터 또는 결과값으로 이용합니다.
만약 바이트 스트림인 경우 이를 다시 문자열로 변환하기 위하여 decode()를 호출하여야
합니다. 패러미터는 디코딩 문자셋인데 디폴트는 "UTF-8" 입니다.


8) ImportError: No module named 'xmlrpclib'

import xmlrpc.client as xmlrpclib

2.x에 xmlrpclib 모듈을 이용했었다면 이제는
xmlrpc.server 와 xmlrpc.client 로 나누어 이용합니다.
클라이언트였다면 위와 같이 할 수 있습니다.


9) AttributeError: 'dict' object has no attribute 'iteritems'
<<<
d.iteritems()
>>>
d.items()

dict 타입에 대하여 iteritems 메서드를 호출한 경우에는 items를 대신 부르면 됩니다.


10.1) AttributeError: 'dict' object has no attribute 'has_key'
<<<
d.has_key(k)
>>>
in d

dict 에 대하여 has_key() 로 해당 키가 존재하는가를 2.x에서 많이 조사하였는데,
이 대신 in 오퍼레이터를 사용합니다.


10.2) 'dict.keys()' object is not list
<<<
ks=d.keys()
isinstance(ks, list)
>>>
False

dict 에 대하여 has_key() 로 해당 키가 존재하는가를 2.x에서 많이 조사하였는데,
기존 2에서 dict.keys() 로 해당 키만 가져오면 디폴트로 list 였지만 3에서는 dict_keys 라는 class가 리턴됩니다.
2에서 처럼 사용하고 싶으면...
<<<
ks=list(d.keys())
isinstance(ks, list)
>>>
True



11) import thread : ImportError
<<<
thread.get_ident()
>>>
threading.current_thread().ident

2.x에서 thread.get_ident() 를 호출하여 현재 쓰레드의 int 형 id를 얻었었는데 
3.x에서는 thread 모듈 자체가 없어졌군요.
대신 threading.current_thread().ident 라고 호출하면 됩니다.


12) TypeError: write() argument must be str, not bytes
또는 EOFError: Ran out of input

from pickle import loads, dumps

d={}

s = dumps(d)
with open('load_dump.pkl', 'bw+') as ofp:
  ofp.write(s)

with open('load_dump.pkl', 'br+') as ifp:
  s = ifp.read()
ld = loads(s)

print(d == ld)

위에 처럼 'w' 대신 'bw+', 'r' 대신 'br+'라고 지정
pickle을 위하여 dumps 혹은 loads를 하여 파일에 저장한다고 하였을 때
해당 저장 파일은 바이너리로 열고 닫아야 합니다.


13) AttributeError: 'function' object has no attribute 'func_name'
<<<
if original_function.func_name not in __ARG_SPEC__:
>>>
if original_function.__name__ not in __ARG_SPEC__:

함수 이름을 Inspect 할 경우 
기존의 func_name 대신 __name__ 이라고 참조합니다.


기타 더 많은 것들이 있을 수 있으나 이 정도면 이상없이 잘 동작했습니다.

또한 다음과 같은 서드파티 모듈들도 모두 3.x 를 잘 지원하였습니다.


pip3 install pudb # for terminal debugger
pip3 install psutil # for system resource monitoring
pip3 install pycrypto # for F33.util.ftcipher
pip3 install termcolor # for console color
pip3 install APScheduler # for F33.util.svc.service
pip3 install ujson # fast json encoder/decoder
pip3 install leveldb # for leveldb key-value storage
pip3 install requests # for task-job
pip3 install celery # for task-job
pip3 install redis # for task-job


14) apply built-in 함수

apply(pack, vs)

와 같이 사용한 소스도 있는데 2.3 에서 부터는 거의 이용되지 않는다고 합니다.
3에서는 아예 없어 졌네요.

apply(function, args, kwargs)

와 같이 사용된 것은

function(*args, **kwargs)

로 이용하면 된다고 합니다.



어느 분께는 도움이 되셨기를...

http://egloos.zum.com/mcchae/v/11195891


반응형

+ Recent posts

반응형