Python 一个使用numpy的热编码
如果输入为零,我想制作一个如下所示的数组:Python 一个使用numpy的热编码,python,numpy,one-hot-encoding,Python,Numpy,One Hot Encoding,如果输入为零,我想制作一个如下所示的数组: [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) 但它没有起作用 有什么方法可以在一行中实现吗?类似于: np.array([int(i == 5) for i in range(10)]) 我们应该做到这一点。 但我认为使用numpy还有其他解决方案 编辑:公式不起作用的原因:np.put不返回任何内容,它只是修改第
[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)
但它没有起作用
有什么方法可以在一行中实现吗?类似于:
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()
之前,您需要定义数组。这里的问题是您不保存数组。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
在我看来,如果没有特殊的理由作为一个班轮这样做,这将是正确的方法。这可能更容易阅读,可读的代码是很好的代码。快速查看,您将看到np.put
不返回值。虽然您的技术很好,但您正在访问None
,而不是结果数组
对于一维数组,最好只使用直接索引,特别是对于这样一个简单的情况
以下是如何以最少的修改重写代码:
arr = np.zeros(10)
np.put(arr, 5, 1)
下面是如何使用索引而不是put
执行第二行:
arr[5] = 1
np.put
将其数组arg变位。在Python中,执行就地变异的函数/方法通常返回None
<代码>np。put遵守该惯例。所以如果a
是1D数组,那么
a = np.put(a, 5, 1)
然后a
将被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]
使用
np.identity
或np.eye
。您可以使用输入i和数组大小s尝试以下操作:
np.identity(s)[i:i+1]
例如,print(np.identity(5)[0:1])
将导致:
[[ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
如果您使用的是TensorFlow,您可以使用tf.one_hot:通常,当您想要在机器学习中获得一个one hot编码进行分类时,您有一个索引数组
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\u hot\u目标
现在处于关闭状态
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.]]])
.reformate(-1)
用于确保标签格式正确(您可能还有[[2]、[3]、[4]、[0]]
)。-1
是一个特殊值,表示“将所有剩余的内容放入此维度”。因为只有一个,所以它会使阵列变平
复制粘贴溶液
包裹
你可以用。它经过测试,使用简单:
import mpu.ml
one_hot = mpu.ml.indices2one_hot([1, 3, 0], nb_classes=5)
我不确定它的性能,但是下面的代码很好用
x = np.array([0, 5])
x_onehot = np.identity(6)[x]
您可以使用列表理解:
[0 if i !=5 else 1 for i in range(10)]
转向
[0,0,0,0,0,1,0,0,0,0]
它是怎么不起作用的?你为什么要在一行中这样做?如果您想保持简洁,只需编写一个函数。通常,当您至少收到一个解决问题的答案时,您会选择其中一个答案。@AbhijayHildyal:这几乎是实现您所需的最低效的方法。@PM2Ring我知道我写的一个行文不好,但是你有没有任何消息来源告诉你应该和不应该对列表和numpy数组做什么?@HolyDanna:Python中的一条普遍规则是,Python循环比使用C代码执行的循环运行得慢。因此,如果有一种明显的方法可以使用C循环而不是Python循环,那么应该使用C循环。使用Numpy的全部目的是尽可能以C速度进行数组处理。我不熟悉numpy源代码,但是
numpy.zeros
可能比Cfor
循环运行得更快,因为CPU可以很快地用单个值填充内存块。顺便说一句,我并不是说您的第一个代码示例不好。在非Numpy程序中,这将是一种很好的方法,并且仅为该操作导入Numpy是愚蠢的。但是,如果程序已经在使用Numpy,那么利用Numpy提供的功能是有意义的。使用a=np.zeros(10)
,我在第一个版本中得到了一个稍微快一点的版本:0.0007712841033935547秒
与第二个版本的0.00088357925415906秒
相比a=np.zeros(10);a[l]=1
;索引赋值比函数调用快。我的one_hot
函数比这个内联版本稍微慢一点,这也是由于函数调用的开销,但它比其他技术快。但是,此计时信息不是很准确,您应该使用timeit
模块,并使用其功能执行数百(或数千)次测试,以获得有意义的结果,而不会被CPU正在执行的其他任务的“噪音”淹没。谢谢。您知道检查代码运行时间的更好方法吗?正如我所说的,使用模块。FWIW,这里是我最近的几个答案,它们使用了timeit
,我不接受这些,以免对人无礼,但它是如何工作的<代码>np.eye(nb_类)应为6x6矩阵,但其形状更改为4x6。你能在这个问题上进行讨论吗?np.eye(nb_类)
是一个6x6矩阵。然后选择目标中指定的行。我只选择了四个,所以它是一个4x6矩阵。这似乎只适用于2维目标,但可以通过执行。重塑(列表(targets.shape)+[nb_类])
你能解释一下np.eye(nb_类)[np.array(targets.shape(-1)]
工作的原因吗?这是一个被H*W矩阵索引的CxC矩阵?!这是怎么回事?@gebbissimo首先,试着理解np.eye(n)
的作用。然后np.eye(5)[[3,1]][0 if i !=5 else 1 for i in range(10)]
[0,0,0,0,0,1,0,0,0,0]