python/numpy 中具有固定精度的小数的一次性编码
One-hot encoding of decimals with a fixed precision in python/numpy
在 Python 中,我想实现 one-hot 十进制数的精确编码,直到 10^{-3}
。鉴于我的输入分数是,例如 interval = [0.433,0.223,0.111]
,它将为间隔中的每个数字生成一堆单热向量。所以对于第一个浮点数 0.433
我们应该得到 4 ---> 0 0 0 0 1 0 0 0 0 0
, 3 ---> 0 0 0 1 0 0 0 0 0 0
, 3 ---> 0 0 0 1 0 0 0 0 0 0
然后连接这三个获得一个 30 维的单热数组。
另外,我想知道:即使输入的数字是,比方说,[0.4,0.2,0.1]
,有没有办法应用与以前相同的技术?就像考虑数学上等价的数字 [0.400,0.200,0.100]
?
编辑:
这是我提议的尝试。我不确定这是完成结果的最佳方法,另外这不能解决我们给出的情况 [0.4, 0.2]
但我们想将其解释为 [0.400, 0.200]
.
def encode_digits(floats: list):
decimals = []
for f in floats:
decimals.append(str(f).split('0.',1)[1])
one_hot = []
for i in range(2):
for j in range(3):
temp =np.zeros(10)
temp[int(decimals[i][j])] += 1
one_hot.append(temp)
return np.array(one_hot).reshape(-1)
按照评论中的建议,您可以乘以 1000 并转换为整数。此后,您可以从数字 i
中提取每个单独的数字,最后应用标准 one-hot 编码:
i = (np.array(interval) * 1000).astype(int)
digits = i // 10 ** np.arange(len(i))[::-1, None] % 10
np.eye(10, dtype=int)[digits.T]
输出:
array([[[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]]])
如果您希望将其连接成一个 30 维数组,您可以这样做:
np.eye(10, dtype=int)[digits.T].reshape(3, 3 * 10)
输出:
array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0]])
在 Python 中,我想实现 one-hot 十进制数的精确编码,直到 10^{-3}
。鉴于我的输入分数是,例如 interval = [0.433,0.223,0.111]
,它将为间隔中的每个数字生成一堆单热向量。所以对于第一个浮点数 0.433
我们应该得到 4 ---> 0 0 0 0 1 0 0 0 0 0
, 3 ---> 0 0 0 1 0 0 0 0 0 0
, 3 ---> 0 0 0 1 0 0 0 0 0 0
然后连接这三个获得一个 30 维的单热数组。
另外,我想知道:即使输入的数字是,比方说,[0.4,0.2,0.1]
,有没有办法应用与以前相同的技术?就像考虑数学上等价的数字 [0.400,0.200,0.100]
?
编辑:
这是我提议的尝试。我不确定这是完成结果的最佳方法,另外这不能解决我们给出的情况 [0.4, 0.2]
但我们想将其解释为 [0.400, 0.200]
.
def encode_digits(floats: list):
decimals = []
for f in floats:
decimals.append(str(f).split('0.',1)[1])
one_hot = []
for i in range(2):
for j in range(3):
temp =np.zeros(10)
temp[int(decimals[i][j])] += 1
one_hot.append(temp)
return np.array(one_hot).reshape(-1)
按照评论中的建议,您可以乘以 1000 并转换为整数。此后,您可以从数字 i
中提取每个单独的数字,最后应用标准 one-hot 编码:
i = (np.array(interval) * 1000).astype(int)
digits = i // 10 ** np.arange(len(i))[::-1, None] % 10
np.eye(10, dtype=int)[digits.T]
输出:
array([[[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]]])
如果您希望将其连接成一个 30 维数组,您可以这样做:
np.eye(10, dtype=int)[digits.T].reshape(3, 3 * 10)
输出:
array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0]])