반응형

TA-Lib 설치

pip로 설치가 안 됨

확인해보니 ta-lib c library를 먼저 설치해야 함.

  • TA-Lib c 라이브러리 설치

참고주소: https://mrjbq7.github.io/ta-lib/install.html

$ wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
$ untar and cd
$ ./configure --prefix=/usr
$ make
$ sudo make install
  • pip 설치
    (venv) $ pip install TA-Lib
    

위 작업까지 해도 python에서 import talib이 다음처럼 실패함을 확인

(venv) $ python
>>> import talib
Traceback (most recent call last):                                                                                                          
  File "", line 1, in                                                                                                         
  File "/home/kfits/tf/venv/lib/python2.7/site-packages/talib/__init__.py", line 4, in                                               
    from . import common
ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory
  • LD_LIBRARY_PATH 설정

HOME 디렉터리에서 다음 작업을 합니다.

$ cd
$ vi .bash_profile
# 다음 2줄 소스 추가.
LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
  • jupyter notebook을 재기동
    $ cd
    $ cd tf
    $ source source/bin/activate
    (venv) $ jupyter notebook --ip=0.0.0.0 --port=8080 --no-browser &


TensorFlow 오류

scikit-learn을 pip로 설치하고 나서 TensorFlow가 Segmentation 오류가 납니다. 다음은 해결 방법입니다.

import numpy as np
import tensorflow as tf

위에처럼 'import numpy'를 'import tensorflow' 이전에 추가합니다.


코딩 reference

전일비 구하기

df_all['Target'] = df_all['Close'].shift(1)/df_all['Close']
  • Dataframe.shift: period 수만큼 index를 이동시킨다. (period일 전 데이터를 구할 때 사용)

참고주소: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html

데이터프레임 랜덤하게 섞기

http://stackoverflow.com/questions/29576430/shuffle-dataframe-rows

  • df.iloc[np.random.permutation(len(df)] 참고함.

데이터프레임 행(row) iterator

for inx, row in df_master.iterrows():
# inx는 df_master 각 행의 index, row는 df_master 각 행의 값.


반응형
반응형

출처 

https://mariadb.com/kb/en/mariadb/memory-storage-engine/



MEMORY 저장 엔진

MEMORY Storage Engine


(이전엔 HEAP으로 알려진) MEMORY 저장 엔진의 내용은 디스크보다 메모리에 보관됩니다.


Contents of the MEMORY storage engine (previously known as HEAP) are stored in memory rather than on disk.


다른 테이블로부터 데이터의 읽기전용 캐쉬 즉 임시적인 작업 영역에서 사용하는 데 최고입니다.


It is best-used for read-only caches of data from other tables, or for temporary work areas.


데이터가 메모리에 보관되기 때문에 정전이나 하드웨어 고장에 매우 취약하며 영원히 데이터를 보관하는 데는 적절하지 않습니다. 사실, 서버가 재시작 하면 MEMORY 테이블은 (정의 파일이 디스크에 저장되기 때문에) 재생성 되지만 그 내용은 비어있을 것입니다. --init-file 서버 시작(startup) 옵션을 사용하여 쿼리로 원하는 내용을 다시 채울 수 있습니다.


Since the data is stored in memory, it is highly vulnerable to power outages or hardware failure, and is unsuitable for permanent data storage. In fact, after a server restart, MEMORY tables will be recreated (because the definition file is stored on disk), but they will be empty. It is possible to re-populate them with a query using the --init-file server startup option.


VARCHAR 같은 변수-길이 타입은 MEMORY 테이블에서 사용될 수 있습니다. BLOB 또는 TEXT 열(column)은 MEMORY 테이블에서 지원되지 않습니다.


 Variable-length types like VARCHAR can be used in MEMORY tables. BLOB or TEXT columns are not supported for MEMORY tables.


MEMORY 테이블의 최대 총 용량은 max_heap_table_size 시스템 서버 변수를 넘어설 수 없습니다. 테이블이 만들어질 때 이 값은 그 테이블에 적용하며, 서버가 재시작될 때 이 값은 현재 있는 테이블에 적용합니다. 이 값을 바꾸는 것은 현재 있는 테이블에는 효과가 없습니다. 하지만 ALTER TABLE ... ENGINE=MEMORY 문장의 실행은 그 테이블의 max_heap_table_size의 현재 값을 적용합니다. 또한 테이블을 만들기 전에 max_heap_table_size의 세션 값을 변경하는 것이 가능합니다.


 The maximum total size of MEMORY tables cannot exceed the max_heap_table_size system server variable. When a table is created this value applies to that table, and when the server is restarted this value applies to existing tables. Changing this value has no effect on existing tables. However, executing a ALTER TABLE ... ENGINE=MEMORY statement applies the current value ofmax_heap_table_size to the table. Also, it is possible to change the session value of max_heap_table_size before creating a table, to make sure that tables created by other sessions are not affected.


MAX_ROWS 테이블 옵션은 당신이 테이블에 저장할 행수에 관해 힌트를 제공합니다. 이 값은 초과할 수 없는 한계는 없지만, max_heap_table_size를 넘어설 수 없습니다. 저장 엔진은 테이블에 할당된 최대 메모리를 계산하는 데 max_heap_table_size와 MAX_ROWS를 사용합니다.


 The MAX_ROWS table option provides a hint about the number of rows you plan to store in them. This is not a hard limit that cannot be exceeded, and does not allow to exceed max_heap_table_size. The storage engine uses max_heap_table_size and MAX_ROWS to calculate the maximum memory that could be allocated for the table.


행이 삭제되었을 때 그 공간은 자동으로 해제되지 않습니다. 테이블을 없애지(drop) 않고 공간을 해제하는 유일한 방법은 ALTER TABLE tbl_name ENGINE = MEMORY 를 사용하는 것입니다. TRUNCATE TABLE도 메모리를 해제합니다.


 When rows are deleted, space is not automatically freed. The only way to free space without dropping the table is usingALTER TABLE tbl_name ENGINE = MEMORY

TRUNCATE TABLE frees the memory too.


인덱스 타입

Index type


MEMORY 저장 엔진은 B-tree 또는 Hash 인덱스를 허용합니다. 해시는 MEMORY에 대한 기본 타입 입니다. 보관 엔진 인덱스 타입을 보시면 더 많은 성질들을 확인할 수 있습니다.


The MEMORY storage engine permits indexes to be either B-tree or Hash. Hash is the default type for MEMORY. See Storage Engine index types for more on their characteristics.


MEMORY 테이블은 64개의 인덱스까지, 각 인덱스당 16개의 열(column)과 최대 키의 길이는 3072바이트까지 가질 수 있습니다.


A MEMORY table can have up to 64 indexes, 16 columns for each index and a maximum key length of 3072 bytes.

추가 보기

See also

 

 


예시

Example

다음 예시는 위에서 묘사된 주어진 최대 크기로 MEMORY 테이블을 만드는 방법을 보여줍니다.

The following example shows how to create a MEMORY table with a given maximum size, as described above.


반응형

'번역' 카테고리의 다른 글

테스트 주도 개발  (0) 2016.01.22
Computer virus  (0) 2009.10.07
악성코드  (0) 2009.10.07
BHO  (0) 2009.10.07
행성의 정의  (0) 2009.08.03
반응형

출처 : http://stackoverflow.com/questions/37061089/trouble-with-tensorflow-in-jupyter-notebook

Jupyter Notebook에서 TensorFlow 사용 문제

저는 Ubuntu 14.04에서 Anaconda를 통해 Jupyter Notebook을 설치했고 바로 TensorFlow를 설치 하였습니다. 저는 TensorFlow가 Notebook에서나 간단히 스트립트를 작성하는 것과 상관 없이 작동하게 하고 싶습니다. 이를 이루기 위한 저의 시도에서, 저는 TensorFlow를 두 번 설치를 했는데 첫 번째는 Anaconda를 사용하였고 그 다음은 pip를 사용하였습니다. Anaconda 설치가 잘 되었지만 "source activate tensorflow"를 python에서 먼저 실행할 필요가 있었습니다. 만약 python을 (터미널에서) 일반적인 방법으로 시작하면 pip 설치는 잘 작동하였고 tensorflow도 잘 불러 왔습니다.

저의 질문은 어떻게 Jupyter notebook에서 이를 잘 실행할 수 있을까요? 입니다.

이는 저를 더 일반적인 질문으로 이끌었습니다. 저의 Jupyter/Anaconda에서 python kernel은 시스템에서 널리 사용되는 python kernel(또는 환경? 여기서 용어는 확실하지 않습니다)과 분리되어 있는 거 같습니다. 이 커널들을 동시에 제어한다면 좋겠습니다. 이게 된다면 제가 새로운 python 라이브러리를 설치할 때 python을 실행하는 모든 다양한 방법으로 접근할 수 있기 때문입니다.


4 개의 답변 중 1 개의 답변만 추려냄.

업데이트

TensorFlow 웹 사이트는 5 개의 설치를 지원합니다.

제가 이해한 바로는 Pip 설치를 직접 사용하여 Jupyter Notebook에서 TensorFlow를 가져 오는 것이 좋습니다 (Jupyter Notebook이 설치되어 있고 다른 문제가 없는 한) b/z 가상 환경을 만들지 않았습니다.

virtualenv 설치 및 conda 설치를 사용하려면 새로 생성된 TensorFlow 환경에 jupyter를 설치하여 TensorFlow가 Jupyter Notebook에서 작동할 수 있도록 해야 합니다. (자세한 내용은 다음 원본 게시물 섹션 참조).

Docker 설치는 VirtualBox에 일부 포트 설정이 있어야 Jupyter Notebook에서 TensorFlow가 작동 할 수 있습니다 (이 게시물 참조).

소스에서 설치하는 경우 소스 코드가 빌드되고 설치된 환경에 따라 다릅니다. 새로 생성된 가상 환경 또는 Jupyter Notebook이 설치되지 않은 가상 환경에 설치된 경우 Jupyter Notebook에서 Tensorflow를 사용하려면 Jupyter Notebook도 가상 환경에 설치해야 합니다.

원래 글

Ipython 또는 Jupyter(Ipython) Notebook에서 TensorFlow를 사용하려면 tensorflow가 활성화된 환경에서 (tensorflow를 설치한 뒤에) Jupyter와 Ipython을 설치해야 합니다.

tensorflow 환경에서 Ipython과 Jupyter를 설치하기 전에 터미널에서 다음 명령어를 실행합니다.

username$ source activate tensorflow

(tensorflow)username$ which ipython
(tensorflow)username$ /Users/username/anaconda/bin/ipython

(tensorflow)username$ which jupyter
(tensorflow)username$ /Users/username/anaconda/bin/jupyter

(tensorflow)username$ which python
(tensorflow)username$ /User/username//anaconda/envs/tensorflow/bin/python

이는 당신이 터미널에서 python을 열었을 때, tensorflow가 설치된 "환경"에서 설치된 것들을 이렇게 사용중이라고 당신에게 말해줍니다. 그러므로 당신은 실제 import tensorflow가 성공적으로 가능합니다. 하지만, ipython 또는 jupyter notebook을 실행한다면, 이들은 tensorflow에 장착된 "환경"에서 설치되지 않았기 때문에 tensorflow 모듈이 없는 일반적인 환경을 사용하기 때문에 import 오류가 나오게 됩니다.

당신은 envs/tensorflow/bin 디렉터리에서 파일 목록을 봄으로서 이를 검증할 수 있습니다.

(tensorflow) username$ ls /User/username/anaconda/envs/tensorflow/bin/

당신은 "ipython"이나 "jupyter" 목록이 없음을 알 수 있습니다.

Ipython 또는 Jupyter Notebook에서 tensorflow를 사용하려면, 간단하게 tensorflow 환경에서 Notebook을 설치하면 됩니다.

(tensorflow) username$ conda install ipython
(tensorflow) username$ pip install jupyter #(use pip3 for python3)

이들을 설치한 후, "jupyter"와 "ipython"은 envs/tensorflow/bin 디렉터리에서 보일 것입니다.

알아두세요: jupyter notebook에서 tensorflow 모듈을 import하기 전에, notebook을 먼저 닫으세요. 그리고 "source deactivate tensorflow"를 먼저 하고 "같은 페이지"에서 이들의 실행을 보장하기 위해 다시 그것을 ("source activate tensorflow") 활성화 하세요. 그리고 notebook을 다시 열어 import tensorflow 해보세요. 성공적으로 import 될 것입니다. (적어도 저는 작동했습니다.)

반응형
반응형

출처 : http://stackoverflow.com/questions/3437404/min-and-max-in-c

C언어에서 MIN과 MAX

C에서 정의된 MINMAX가 어디에 있습니까?

가능한 일반적이고 안전하게 이를 구현하는 최고의 방법은 무엇입니까? (주요 컴파일러에서 사용하는 컴파일러 확장/빌트인을 선호합니다.)


15 개의 답변 중 1 개의 답변

C에서 정의된 MINMAX 가 어디에 있습니까?

없습니다.

가능한 일반적이고 안전하게 이를 구현하는 최고의 방법은 무엇입니까? (주요 컴파일러에서 사용하는 컴파일러 확장/빌트인을 선호합니다.)

함수로써 저는 #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))같은 매크로를 사용하지 않을 것입니다. 특별히, 당신의 코드에 배포할 계획이 있다면요. GCC 구문 표현에서 당신 스스로 표준인 fmax또는 fmin같은 것을 사용하거나 GCC의 typeof를 사용한 매크로를 고칠것입니다. (타입에 안전함도 보너스로 얻을 것입니다.)

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

모두가 "아, 이중 평가에 대해 알고 있습니다. 문제가 없습니다."라고 말하고 몇 달 후에는 몇 시간 동안 가장 어리석은 문제를 디버깅하게 될 것입니다.

typeof 대신에 __typeof__를 사용하세요.

만약 ISO C 프로그램에서 include될 때 당신이 헤더파일을 작성한다면 typeof 대신에 __typeof__를 써야 작동될 것입니다.

반응형
반응형

출처 

http://chrisalbon.com/python/pandas_create_column_with_loop.html

For 루프로 Pandas 열 만들기


사전준비

import pandas as pd
import numpy as np

데이터프레임 예시 만들기

raw_data = {'student_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'test_score': [76, 88, 84, 67, 53, 96, 64, 91, 77, 73, 52, np.NaN]}
df = pd.DataFrame(raw_data, columns = ['student_name', 'test_score'])


학점을 할당하기 위한 함수 만들기

# 데이터를 저장할 list(리스트)를 만듭니다. grades = [] # 열에 추가할 각 행을 For로 순회합니다, for row in df['test_score']: # 이 값보다 크면, if row > 95: # 'A' 학점으로 list에 추가합니다. grades.append('A') # 아니고, 이 값보다 크면, elif row > 90: # 'A-' 학점으로 list에 추가합니다. grades.append('A-') # 아니고, 이 값보다 크면, elif row > 85: # 'B' 학점으로 list에 추가합니다. grades.append('B') # 아니고, 이 값보다 크면, elif row > 80: # 'B-' 학점으로 list에 추가합니다. grades.append('B-') # 아니고, 이 값보다 크면, elif row > 75: # 'C' 학점으로 list에 추가합니다. grades.append('C') # 아니고, 이 값보다 크면, elif row > 70: # 'C-' 학점으로 list에 추가합니다. grades.append('C-') # 아니고, 이 값보다 크면, elif row > 65: # 'D' 학점으로 list에 추가합니다. grades.append('D') # 아니고, 이 값보다 크면, elif row > 60: # 'D-' 학점으로 list에 추가합니다. grades.append('D-') # 아니면, else: # 'F' 학점을 추가합니다. grades.append('Failed') # list(리스트)로부터 'grades'열을 추가합니다. df['grades'] = grades

# 새로운 dataframe(데이터프레임)을 봅니다. df

student_nametest_scoregrades
0Miller76C
1Jacobson88B
2Ali84B-
3Milner67D
4Cooze53Failed
5Jacon96A
6Ryaner64D-
7Sone91A-
8Sloan77C
9Piger73C-
10Riani52Failed
11AliNaNFailed


반응형
반응형

출처 : http://stackoverflow.com/questions/279561/what-is-the-python-equivalent-of-static-variables-inside-a-function

Python에서 함수 안의 static 변수와 같은 것은 무엇입니까?

이 C/C++ 코드와 Python에서 같은 것은 무엇입니까?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %d\n", counter);
}

특별히, 클래스 레벨과는 다르게 함수 레벨에서 어떻게 static 멤버를 구현할 수 있습니까? 함수를 클래스로 넣는 것을 다른 걸로 바꿀 수 있습니까?


18 개의 답변 중 2 개의 답변만 추려냄.

다음은 작동해야 합니다.

def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
foo.counter = 0

counter의 초기화 코드를 제일 밑에 대신에 제일 위에 오도록 하고 싶다면 decorate를 만들 수 있습니다.

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

그리고 나서 다음처럼 코드를 사용합니다.

@static_vars(counter=0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

불행히도 접두사로는, 여전히 foo를 사용해야합니다.


당신은 함수에 속성(attribute)을 추가할 수 있습니다. 그것을 static 변수로 사용하면 됩니다.

def myfunc():
  myfunc.counter += 1
  print myfunc.counter

# 속성은 반드시 초기화 되어야 합니다.
myfunc.counter = 0

다른 대안으로 함수 밖에 변수를 설정하길 원하지 않는다면, 당신은 AttributeError exception을 피하기 위해 hasattr()를 사용할 수 있습니다.

def myfunc():
  if not hasattr(myfunc, "counter"):
     myfunc.counter = 0  # it doesn't exist yet, so initialize it
  myfunc.counter += 1

static 변수는 드물게 사용되기 때문에 당신은 이 변수를 사용하기 더 좋은 위치를 찾는게 좋고 대부분은 클래스 안에 멤버변수로 사용합니다.

반응형
반응형

출처 : http://blog.tanelpoder.com/2009/01/22/identifying-shared-memory-segment-users-using-lsof/

lsof를 사용하여 공유메모리 사용자를 식별하기

lsof(열린 파일의 목록을 보여주는 프로그램)은 지워진 파일의 해제 또는 공유메모리의 삭제를 방해하는 열려있는 파일 디스크립터의 문제를 해결하는데 매우 유용한 도구입니다.

이 예시는 리눅스에서 Oracle 사용자의 공유메모리가 해제되지 않고 아직 사용중이라고 표시되고 있는 상황입니다.

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 393216     oracle    640        289406976  1          dest
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  22

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

진하게 표시된 줄은 인스턴스가 닫힌 후에 사라져야 하지만 그렇지 못했습니다. "nattch"(공유메모리에 접근한 프로세스들의 수)로부터 저는 공유메모리를 사용하는 몇개의 프로세스가 아직 있다는 것을 알았습니다. 그래서 이 조각은 해제되지 않았고 ipcrm 명령어조차 그것(누군가 파일들을 열었다면 정상 파일인것처럼)을 삭제할 수 없었습니다.

그래서 이 공유메모리를 사용하는 프로세스를 식별할 필요가 있었습니다. 만약 보통 존재하는 파일이었다면 어떤 프로세스가 그 파일을 열었는지 /sbin/fuser 명령을 사용했겠지만 이 명령은 디렉터리에서 현재 존재하는 파일에 대해서만 작동합니다.

하지만 지워진 파일, 소켓이나 공유 메모리를 위해서는 lsof 명령을 사용할 수 있습니다. (보통 리눅스에 기본으로 설치되어 있지만 Unix에서는 별도로 다운로드 받아 설치해야 합니다.)

ipcs -ma가 보여주듯이 사용중인 SHM ID는 393216이며 저는 SHM ID를 grep하여 모든 열여 있는 파일 디스크립터를 보여주도록 lsof를 다음처럼 실행하였습니다.

$ lsof | egrep "393216|COMMAND"
COMMAND     PID      USER   FD      TYPE     DEVICE       SIZE       NODE NAME
python    18811    oracle  DEL       REG        0,8                393216 /SYSVbfb94e30

NODE 열에 대응되는 ipcs의 출력된 SHM ID와 대응되는지 알 수 있습니다.
그래서 저는 아직 SHM 에 접근 중인 PID 18811을 kill 하였습니다.

$ kill 18811

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  25

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

해당 공유메모리가 사라지고 해제되었습니다.

명령은 다른 작업을 하는데도 매우 유용합니다. 예를 들어, 네트워크 프로토콜, IP, port 등 열여 있는 소켓을 보여주기도 합니다. 예를 들어 OS level에서 어떤 클라이언트가 서버 프로세스와 통신하는 지 확인 할 수 있습니다.

$ lsof -i:1521
COMMAND   PID   USER   FD   TYPE DEVICE SIZE NODE NAME
tnslsnr  6212 oracle   11u  IPv4  49486       TCP *:1521 (LISTEN)
tnslsnr  6212 oracle   13u  IPv4 276708       TCP linux03:1521->linux03:37277 (ESTABLISHED)
tnslsnr  6212 oracle   14u  IPv4 264894       TCP linux03:1521->linux03:41122 (ESTABLISHED)
oracle  22687 oracle   20u  IPv4 264893       TCP linux03:41122->linux03:1521 (ESTABLISHED)
oracle  25250 oracle   15u  IPv4 276707       TCP linux03:37277->linux03:1521 (ESTABLISHED)
oracle  25530 oracle   15u  IPv4 279910       TCP linux03:1521->192.168.247.1:nimsh (ESTABLISHED)

불행히도 lsof는 클래식 유닉스에서 기본적으로 설치되지 않지만 일부에서는 시스템 관리자가 설치하기로 선택했습니다. 그러나 lsof는 /dev/kmem 또는 이와 유사한 것을 통해 커널 메모리 구조에 액세스해야 하므로 일반 사용자에게는 작동하지 않을 수 있습니다. lsof에 액세스할 수 없다면 lsof가 할 수 있는 몇 가지 트릭을 수행할 수 있는 다른 도구가 있을 수 있습니다. 예를 들어 Solaris에는 프로세스의 열린 파일을 표시할 수 있는 유용한 명령 pfiles가 있으며 (내 생각에는) Solaris 9 부터 네트워크 소켓의 TCP 연결 endpoint도 보고할 수 있습니다…

반응형
반응형

출처 : http://stackoverflow.com/questions/3422685/what-is-python-buffer-type-for

Python의 buffer 타입은 무엇을 위한 건가요?

Python에는 buffer타입이 있습니다만 저는 어떻게 그것을 사용해야 할 지 모르겠습니다.

Python doc 설명은 다음과 같습니다.

buffer(object[, offset[, size]])

object 매개변수는 buffer 호출 인터페이스(문자열, 배열, 버퍼등)를 지원하는 객체여야 합니다. 새로운 buffer 객체는 object 매개변수를 참조하도록 만들어질 것입니다. buffer 객체는 객체의 시작부터 (또는 offset 위치부터) slice 될 수 있습니다. 이 slice는 객체의 끝 (또는 size 매개변수로 주어진 길이)까지 확장될 수 있습니다.


2 개의 답변 중 1 개의 답변만 추려냄.

다음은 사용 예시입니다.

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

이 경우 buffer는 6번째 위치에서 시작하며 길이가 5인 부분 문자열(sub-string)입니다. 그리고 이는 추가 저장 공간을 필요로 하지 않습니다. 그 이유는 string의 slice를 참조하기 때문 입니다.

이 코드 예시처럼 짧은 문자열에는 매우 유용하지는 않습니다. 하지만 큰 데이터를 사용할 때 필요할 수 있습니다. 이 예시는 변경가능한 bytearray를 사용하였습니다.

>>> s = bytearray(1000000)   # 백만개의 0 값인 바이트배열 
>>> t = buffer(s, 1)         # 인덱스 1의 바이트만 자름
>>> s[1] = 5                 # s에서 두 번째 요소를 5로 세팅
>>> t[0]                     # t에서 첫번째 요소가 s[1]이기도 함
'\x05'

이는 데이터에서 하나 이상의 view가 필요할 때 매우 유용하며 메모리에서 여러개의 복사본을 만들고 싶지 않을 때 유용합니다.

buffer(buffer)는 Python 2.7에도 사용할 수 있지만 Python 3에서 더 좋은 이름인 memoryview(memoryview)로 바뀌었습니다.

또한 C API를 살펴 보지 않고는 자체 객체에 대한 버퍼 인터페이스를 구현할 수 없습니다. 즉, 순수 Python에서는 수행 할 수 없습니다.

반응형
반응형

출처

http://stackoverflow.com/questions/16819222/how-to-return-dictionary-keys-as-a-list-in-python-3-3

Youtube

https://youtu.be/tnJqNEc9knk

Google Colab

https://colab.research.google.com/drive/1PZGbth0ZArjDPkzPBNpT4uCZjRDKPhQ0?usp=sharing

Python에서 dictionary 키를 list로 리턴하는 방법

저는 뭔가 매우 이상하다는 것을 알았습니다. Python 2.7과 Python 3의 오래된 버전에서 뭔가 많이 다른 것이 있습니다.

이전에, dictionary에서 key 값, value 값, item 값을 list로 쉽게 얻을 수 있었습니다.

  • Python 2.7
>>> newdict = {1:0, 2:0, 3:0} 
>>> newdict
{1: 0, 2: 0, 3: 0} 
>>> newdict.keys()
[1, 2, 3]

하지만 Python 3에서는 다음처럼 이렇게 나옵니다.

  • PYTHON 3.3.0
>>> newdict.keys() 
dict_keys([1, 2, 3])

3 개의 답변 중 1 개의 답변만 추려냄.

list(newdict.keys()) 를 시도해 보세요.

이는 dict_keys 객체를 list로 변환할 것입니다.
반면, 당신은 이것이 문제가 되는지 아닌지 스스로에게 물어봐야 합니다. 코드를 Python의 방법으로 작성하는 것은 duck typing(만약 그것이 오리처럼 생겼고, 오리처럼 꽥꽥 운다면 그것은 오리입니다.) 이라 가정합니다. dict_keys 객체는 대부분 list처럼 행동합니다. 예를 들면, 다음 소스처럼 list처럼 작동합니다.

for key in newdict.keys():
    print(key)

1
2
3

답변 후 추가 편집 내용

감사합니다. list(newdict.keys())가 제가 원하는대로 작동합니다.

현재는 다른 것이 저를 괴롭히고 있습니다. 저는 value 값으로 정렬하여 dictionary key 값과 value 값들을 뒤집어(reverse) list로 생성하고 싶습니다. 다음처럼 소스를 작성하였습니다. (다음은 나쁜 예시입니다. 모든 value 값들이 0이기 때문입니다.)

>>> zip(newdict.values(), newdict.keys())
[(0, 1), (0, 2), (0, 3)]

하지만, Python 3에서는 다음처럼 나옵니다.

>>> zip(list(newdict.keys()), list(newdict.values())) <zip object at 0x7f367c7df488>

아, 죄송합니다.

zip() 밖으로 list() 함수를 사용해야 됨을 알았습니다.

list(zip(newdict.values(), newdict.keys())) [(0, 1), (0, 2), (0, 3)]
반응형
반응형

출처 : http://stackoverflow.com/questions/7515266/rounding-problem-with-python

파이썬에서 반올림 문제

파이썬에서 반올림 문제가 있습니다. 제가 다음을 계산하면

32.50 * 0.19 = 6.1749999999999998

가 됩니다. 하지만 이는 6.175가 되어야 합니다. 만약 둘째 자리로 6.1749999999999998을 반올림하면 정확히 6.18을 보여줍니다. 여기까지는 괜찮습니다.

하지만 이를 계산하면

32.50 * 0.19 * 3 = 18.524999999999999

가 됩니다. 이는 18.525가 되어야 합니다. 만약 둘째 자리로 18.524999999999999을 반올림하면 18.52를 보여주어야 합니다.

이 값은 저에게 18.53을 보여주어야 합니다. 제가 무엇을 잘못했는지와 어떻게 이 현상을 고칠 수 있을까요?


7 개의 답변 중 2 개의 답변

당신은 잘못한 게 없고, 파이썬의 잘못도 아닙니다. 몇개의 십진 숫자들은 이진 부동형으로 정확하게 표현을 못할 뿐입니다.

1/3을 십진수로 (0.3333....) 정확히 쓸 수 없는 거처럼, 0.1을 이진수로는(0.000110011...)을 정확히 쓸 수 없습니다.

해결책 A:

print 32.5 * 0.19를 사용합니다. 이는 결과를 자동으로 반올림 합니다.

해결책 B:

예를 들어 통화 값을 계산할 때처럼 정확한 값이 필요하면 Decimal모듈을 사용합니다.

import decimal
D=decimal.Decimal

x=D('32.50')*D('0.19')
print(x)
# 6.1750
print(x.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 6.18

y=D('32.50')*D('0.19')*D('3')
print(y)
# 18.5250
print(y.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 18.53

해결책 C:

interactive session에서 결과를 자동으로 반올림하는 Python 3.2나 Python 2.7을 사용합니다.

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 32.50 * 0.19
6.175

모든 컴퓨터 과학자들이 알아야 할 부동 소수점 계산에 관한 것.

즉, 부동 소수점은 메모리에 저장되어 있는 방법 때문에 정확한 값이라고 의지하면 안 됩니다.

Python 문서에서 이에 관한 것도 보십시오 - 부동 소수점 산수: 이슈와 한계. 이는 다음 구문을 포함합니다.

예를 들어, 둘째 자리로 2.675를 반올림을 시도하면, 다음을 얻을 수 있습니다.
>>> round(2.675, 2)
2.67
빌트인 round 함수에 대한 문서는 가장 가까운 값으로 반올림하고 0에서 멀어지는 쪽으로 올림 혹은 내림 합니다. 십진수 유리수인 2.675는 정확히 2.67과 2.68이기 때문에, 당신은 (이진 근사로) 2.68이 여기 결과로 기대할 것입니다. 하지만 그렇지 않은데 십진수 문자열 2.675는 이진 부동 소수점으로 변환될 때, 이진 근사값으로 대체되는 데 정확한 값은
2.67499999999999982236431605997495353221893310546875 입니다.
이 근사값은 2.68보다는 2.67에 더 가깝기 때문에 내림이 됩니다.

반응형

+ Recent posts