在 numpy 中构造除 1 以外的所有元素都为零的矩阵的有效方法

mj *_*eri 4 python numpy matrix

我想通过比较输出信号及其真实输出值来计算每个输入的神经网络的输出误差,因此我需要两个矩阵来计算此任务。

我有 (n*1) 形状的输出矩阵,但在标签中我只有应该被激活的神经元的索引,所以我需要一个形状相同的矩阵,所有元素都为零,除了它的索引是等于标签。我可以用一个函数来做到这一点,但我想知道numpypython 中是否有一个内置的方法可以为我做到这一点?

umu*_*tto 5

您可以使用 numpy 或标准库以多种方式执行此操作,一种方式是创建一个零数组,并将对应于索引的值设置为 1。

n = len(result)

a = np.zeros((n,)); 
a[id] = 1
Run Code Online (Sandbox Code Playgroud)

它也可能是最快的:

>> %timeit a = np.zeros((n,)); a[id] = 1
1000000 loops, best of 3: 634 ns per loop
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用numpy.pad用零填充 [ 1 ] 数组。但是由于填充逻辑,这几乎肯定会变慢。

np.lib.pad([1],(id,n-id),'constant', constant_values=(0))
Run Code Online (Sandbox Code Playgroud)

正如预期的数量级慢:

>> %timeit np.lib.pad([1],(id,n-id),'constant', constant_values=(0))
10000 loops, best of 3: 47.4 µs per loop
Run Code Online (Sandbox Code Playgroud)

您可以按照评论的建议尝试列表理解:

results = [7]

np.matrix([1 if x == id else 0 for x in results])
Run Code Online (Sandbox Code Playgroud)

但它也比第一种方法慢得多:

>> %timeit np.matrix([1 if x == id else 0 for x in results])
100000 loops, best of 3: 7.25 µs per loop
Run Code Online (Sandbox Code Playgroud)

编辑:但在我看来,如果你想计算神经网络误差。您应该只使用np.argmax并计算它是否成功。该错误计算可能会给您带来比有用处更多的噪音。如果您觉得您的网络容易出现相似之处,则可以制作混淆矩阵。