将一列转换为特定数量的列
Convert one column to specific number of columns
我正在尝试根据它们的值将一列具有 range(0,5)
值的数据转换为 6 列。
例如,如果它的值为 0,那么这六个中的第一列变为 1,其他变为 0,因此 on.However 因为我的目标形状是 (1034892, 1) 它会花费很多时间,甚至有时会崩溃.此代码适用于 500000 条数据,但不适用于此数量。
有什么方法可以处理这么多数据吗?
def convert_to_num_class(target):
for i, value in enumerate(target):
if i ==0:
y_new =np.array( np.eye(6)[int(value[0])])
else:
y_new = np.vstack((y_new, np.eye(6)[int(value[0])]))
return(y_new)
使用 pandas get_dummies
:
>>> target = np.random.randint(6, size=(10, 1)) # the original target is of shape (1034892, 1)
>>> target = target.flatten()
array([0, 1, 0, 0, 4, 3, 1, 5, 4, 5])
>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])
如果您的目标没有您想要的范围内的所有值(如上例中 target
没有值 2),将缺少该缺失的列值。一种解决方法如下:
>>> target = pd.Categorical(target, categories=np.arange(6))
>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]])
即使您拥有 (1034892, 1)
大小的 target
,它也非常快。
我也用 keras.utils.np_utils 的 to_categorical 解决了这个问题,这个数据量只需要一秒钟:
from keras.utils.np_utils import to_categorical
def convert_to_num_class(target):
target = target.astype(np.int)
return(to_categorical(target, len(np.unique(target))))
无需诉诸 pandas
或 keras
,只需使用元组进行索引:
import numpy as np
categories = 6
N = 10
target = np.random.randint(categories, size=(N,1)) # this should be your data
y = np.zeros((N, categories), dtype=np.uint8)
mask = (np.arange(N), target.flatten())
y[mask] = 1
性能检查:
def one_hot(target, categories=None):
target = target.flatten()
N = target.size
if categories is None:
categories = target.max() - target.min() + 1
y = np.zeros((N, categories), dtype=np.uint8)
mask = (np.arange(N), target)
y[mask] = 1
return y
N = 1034892
cats = 6
r = np.random.randint(cats, size=(N))
%timeit one_hot(r)
# 9.63 ms ± 187 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
import pandas as pd
%timeit pd.get_dummies(r).to_numpy()
# 18.2 ms ± 183 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
我正在尝试根据它们的值将一列具有 range(0,5)
值的数据转换为 6 列。
例如,如果它的值为 0,那么这六个中的第一列变为 1,其他变为 0,因此 on.However 因为我的目标形状是 (1034892, 1) 它会花费很多时间,甚至有时会崩溃.此代码适用于 500000 条数据,但不适用于此数量。
有什么方法可以处理这么多数据吗?
def convert_to_num_class(target):
for i, value in enumerate(target):
if i ==0:
y_new =np.array( np.eye(6)[int(value[0])])
else:
y_new = np.vstack((y_new, np.eye(6)[int(value[0])]))
return(y_new)
使用 pandas get_dummies
:
>>> target = np.random.randint(6, size=(10, 1)) # the original target is of shape (1034892, 1)
>>> target = target.flatten()
array([0, 1, 0, 0, 4, 3, 1, 5, 4, 5])
>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])
如果您的目标没有您想要的范围内的所有值(如上例中 target
没有值 2),将缺少该缺失的列值。一种解决方法如下:
>>> target = pd.Categorical(target, categories=np.arange(6))
>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]])
即使您拥有 (1034892, 1)
大小的 target
,它也非常快。
我也用 keras.utils.np_utils 的 to_categorical 解决了这个问题,这个数据量只需要一秒钟:
from keras.utils.np_utils import to_categorical
def convert_to_num_class(target):
target = target.astype(np.int)
return(to_categorical(target, len(np.unique(target))))
无需诉诸 pandas
或 keras
,只需使用元组进行索引:
import numpy as np
categories = 6
N = 10
target = np.random.randint(categories, size=(N,1)) # this should be your data
y = np.zeros((N, categories), dtype=np.uint8)
mask = (np.arange(N), target.flatten())
y[mask] = 1
性能检查:
def one_hot(target, categories=None):
target = target.flatten()
N = target.size
if categories is None:
categories = target.max() - target.min() + 1
y = np.zeros((N, categories), dtype=np.uint8)
mask = (np.arange(N), target)
y[mask] = 1
return y
N = 1034892
cats = 6
r = np.random.randint(cats, size=(N))
%timeit one_hot(r)
# 9.63 ms ± 187 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
import pandas as pd
%timeit pd.get_dummies(r).to_numpy()
# 18.2 ms ± 183 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)