복붙노트

[PYTHON] numpy를 사용한 하나의 핫 인코딩

PYTHON

numpy를 사용한 하나의 핫 인코딩

입력이 0이면 다음과 같은 배열을 만들고 싶습니다.

[1,0,0,0,0,0,0,0,0,0]

입력이 5 인 경우 :

[0,0,0,0,0,1,0,0,0,0]

위의 경우 나는 다음과 같이 썼다.

np.put(np.zeros(10),5,1)

그러나 그것은 작동하지 않았다.

이 방법을 한 줄로 구현할 수 있습니까?

해결법

  1. ==============================

    1.일반적으로 기계 학습에서 분류를위한 원 핫 인코딩을 원할 때 인덱스 배열이 있습니다.

    일반적으로 기계 학습에서 분류를위한 원 핫 인코딩을 원할 때 인덱스 배열이 있습니다.

    import numpy as np
    nb_classes = 6
    targets = np.array([[2, 3, 4, 0]]).reshape(-1)
    one_hot_targets = np.eye(nb_classes)[targets]
    

    one_hot_targets이 (가)되었습니다.

    array([[[ 0.,  0.,  1.,  0.,  0.,  0.],
            [ 0.,  0.,  0.,  1.,  0.,  0.],
            [ 0.,  0.,  0.,  0.,  1.,  0.],
            [ 1.,  0.,  0.,  0.,  0.,  0.]]])
    

    .reshape (-1)는 올바른 라벨 형식 ([2], [3], [4], [0])이 있음을 확인하는 것입니다. -1은 "이 차원에 남아있는 모든 것을 넣으십시오"라는 의미의 특별한 값입니다. 하나만 존재하기 때문에 배열을 평평하게합니다.

    def get_one_hot(targets, nb_classes):
        res = np.eye(nb_classes)[np.array(targets).reshape(-1)]
        return res.reshape(list(targets.shape)+[nb_classes])
    

    mpu.ml.indices2one_hot을 사용할 수 있습니다. 테스트를 거쳐 사용이 간편합니다.

    import mpu.ml
    one_hot = mpu.ml.indices2one_hot([1, 3, 0], nb_classes=5)
    
  2. ==============================

    2.같은 것 :

    같은 것 :

    np.array([int(i == 5) for i in range(10)])
    

    트릭을해야 할 것입니다. 하지만 numpy를 사용하는 다른 솔루션이 있다고 가정합니다.

    편집 : 귀하의 수식이 작동하지 않는 이유 : np.put 아무것도 반환하지 않습니다, 그것은 단지 첫 번째 매개 변수에 주어진 요소를 수정합니다. np.put ()을 사용하는 동안 좋은 대답은 다음과 같습니다.

    a = np.zeros(10)
    np.put(a,5,1)
    

    문제는 np.put ()에 배열을 전달하기 전에 배열을 정의해야하므로 한 줄에서 처리 할 수 ​​없다는 것입니다.

  3. ==============================

    3.설명서를 간단히 살펴보면 np.put이 값을 반환하지 않음을 알 수 있습니다. 기술이 괜찮 으면 결과 배열 대신 없음에 액세스합니다.

    설명서를 간단히 살펴보면 np.put이 값을 반환하지 않음을 알 수 있습니다. 기술이 괜찮 으면 결과 배열 대신 없음에 액세스합니다.

    일차원 배열의 경우, 특히 간단한 경우에는 직접 인덱싱을 사용하는 것이 좋습니다.

    다음은 최소한의 수정으로 코드를 다시 작성하는 방법입니다.

    arr = np.zeros(10)
    np.put(arr, 5, 1)
    

    put 대신에 두 번째 줄을 indexing하는 방법은 다음과 같습니다 :

    arr[5] = 1
    
  4. ==============================

    4.여기서 문제는 배열을 아무 곳에도 저장하지 않는다는 것입니다. put 함수는 배열에서 작동하고 아무 것도 반환하지 않습니다. 배열에 이름을 부여하지 않으므로 나중에 주소를 지정할 수 없습니다. 그래서 이건

    여기서 문제는 배열을 아무 곳에도 저장하지 않는다는 것입니다. put 함수는 배열에서 작동하고 아무 것도 반환하지 않습니다. 배열에 이름을 부여하지 않으므로 나중에 주소를 지정할 수 없습니다. 그래서 이건

    one_pos = 5
    x = np.zeros(10)
    np.put(x, one_pos, 1)
    

    그래도 색인 생성을 사용할 수 있습니다.

    one_pos = 5
    x = np.zeros(10)
    x[one_pos] = 1
    

    필자는 이것이 한 라이너로서 특별한 이유가 없다면이를 수행하는 올바른 방법이라고 생각합니다. 이것은 또한 읽기 쉽고 읽을 수있는 코드는 좋은 코드입니다.

  5. ==============================

    5.np.put은 배열 arg를 in-place로 변경합니다. Python에서 In-place mutation을 수행하여 None을 반환하는 함수 / 메소드는 일반적입니다. np.put은 해당 규칙을 준수합니다. 따라서 a가 1D 배열이고

    np.put은 배열 arg를 in-place로 변경합니다. Python에서 In-place mutation을 수행하여 None을 반환하는 함수 / 메소드는 일반적입니다. np.put은 해당 규칙을 준수합니다. 따라서 a가 1D 배열이고

    a = np.put(a, 5, 1)
    

    그러면 None이 None으로 바뀝니다.

    귀하의 코드는 이와 비슷하지만 이름이 지정되지 않은 배열을 np.put에 전달합니다.

    작고 효율적인 방법으로 원하는 것을 할 수 있습니다. 예를 들면 다음과 같습니다.

    import numpy as np
    
    def one_hot(i):
        a = np.zeros(10, 'uint8')
        a[i] = 1
        return a
    
    a = one_hot(5) 
    print(a)
    

    산출

    [0 0 0 0 0 1 0 0 0 0]
    
  6. ==============================

    6.np.identify 또는 np.eye를 사용하십시오. 당신은 여러분의 입력 i와 배열 크기 s로 다음과 같이 시도 할 수 있습니다 :

    np.identify 또는 np.eye를 사용하십시오. 당신은 여러분의 입력 i와 배열 크기 s로 다음과 같이 시도 할 수 있습니다 :

    np.identify(s)[i:i+1]
    

    예를 들어, print (np.identity (5) [0 : 1]) 결과는 다음과 같습니다.

    [[ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
    

    TensorFlow를 사용하는 경우 tf.one_hot을 사용할 수 있습니다. https://www.tensorflow.org/api_docs/python/array_ops/slicing_and_joining#one_hot

  7. ==============================

    7.List comprehension을 사용할 수 있습니다 :

    List comprehension을 사용할 수 있습니다 :

    [0 if i !=5 else 1 for i in range(10)]
    

    ~으로 변하다

    [0,0,0,0,0,1,0,0,0,0]
    
  8. ==============================

    8.

    import time
    start_time = time.time()
    z=[]
    for l in [1,2,3,4,5,6,1,2,3,4,4,6,]:
        a= np.repeat(0,10)
        np.put(a,l,1)
        z.append(a)
    print("--- %s seconds ---" % (time.time() - start_time))
    
    #--- 0.00174784660339 seconds ---
    
    import time
    start_time = time.time()
    z=[]
    for l in [1,2,3,4,5,6,1,2,3,4,4,6,]:
        z.append(np.array([int(i == l) for i in range(10)]))
    print("--- %s seconds ---" % (time.time() - start_time))
    
    #--- 0.000400066375732 seconds ---
    
  9. ==============================

    9.성능은 확실하지 않지만 다음 코드는 작동하며 깔끔합니다.

    성능은 확실하지 않지만 다음 코드는 작동하며 깔끔합니다.

    x = np.array([0, 5])
    x_onehot = np.identity(6)[x]
    
  10. from https://stackoverflow.com/questions/38592324/one-hot-encoding-using-numpy by cc-by-sa and MIT license