[PYTHON] numpy를 사용한 하나의 핫 인코딩
PYTHONnumpy를 사용한 하나의 핫 인코딩
입력이 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.일반적으로 기계 학습에서 분류를위한 원 핫 인코딩을 원할 때 인덱스 배열이 있습니다.
일반적으로 기계 학습에서 분류를위한 원 핫 인코딩을 원할 때 인덱스 배열이 있습니다.
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.같은 것 :
같은 것 :
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.설명서를 간단히 살펴보면 np.put이 값을 반환하지 않음을 알 수 있습니다. 기술이 괜찮 으면 결과 배열 대신 없음에 액세스합니다.
설명서를 간단히 살펴보면 np.put이 값을 반환하지 않음을 알 수 있습니다. 기술이 괜찮 으면 결과 배열 대신 없음에 액세스합니다.
일차원 배열의 경우, 특히 간단한 경우에는 직접 인덱싱을 사용하는 것이 좋습니다.
다음은 최소한의 수정으로 코드를 다시 작성하는 방법입니다.
arr = np.zeros(10) np.put(arr, 5, 1)
put 대신에 두 번째 줄을 indexing하는 방법은 다음과 같습니다 :
arr[5] = 1
-
==============================
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.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.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.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.
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.성능은 확실하지 않지만 다음 코드는 작동하며 깔끔합니다.
성능은 확실하지 않지만 다음 코드는 작동하며 깔끔합니다.
x = np.array([0, 5]) x_onehot = np.identity(6)[x]
from https://stackoverflow.com/questions/38592324/one-hot-encoding-using-numpy by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 팬더는 열을 가로 질러 합계를하고 그 값에서 각 셀을 나눕니다. (0) | 2018.10.31 |
---|---|
[PYTHON] Django의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까? (0) | 2018.10.31 |
[PYTHON] Tkinter "X"버튼 컨트롤 재정의 (창을 닫는 버튼) [duplicate] (0) | 2018.10.31 |
[PYTHON] hdf5 파일 결합 (0) | 2018.10.31 |
[PYTHON] 터미널에서 파이썬 스크립트를 실행하면 아무것도 인쇄되지 않거나 나타나지 않습니다 - 왜? (0) | 2018.10.31 |