Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个使用numpy的热编码_Python_Numpy_One Hot Encoding - Fatal编程技术网

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
可能比C
for
循环运行得更快,因为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]