我怎样才能获得真正的矩阵

时间:2015-12-08 19:04:09

标签: python

我对此矩阵有疑问:

A=([[2, 3, 4, 2, 1, 3, 4, 1, 3, 2 ]])

我想从A获得另一个矩阵,如下所示:

B=([[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 1, 0, 0]])

为此写了:

import numpy as np
n=np.matrix('[2, 3, 4, 2, 1, 3, 4, 1, 3, 2]')
c=np.matrix('[0, 0, 0, 0]')
d=np.zeros((1,4))
for i in np.nditer(n):
    h=d.itemset((0,i-1),1)
    print d

但是我得到了错误的matris,如下所示

[[ 0.  1.  0.  0.]]
[[ 0.  1.  1.  0.]]
[[ 0.  1.  1.  1.]]
[[ 0.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]
[[ 1.  1.  1.  1.]]

我如何获得真(B)矩阵????

3 个答案:

答案 0 :(得分:0)

这可以帮到你:

from pprint import pprint

A=[[2, 3, 4, 2, 1, 3, 4, 1, 3, 2 ]]
B = [[0]*4 for _ in range(len(A[0]))]

for i,val1 in enumerate(B[:]):
    B[i][A[0][i]-1]=1

pprint(B)

输出:

[[0, 1, 0, 0], 
 [0, 0, 1, 0], 
 [0, 0, 0, 1], 
 [0, 1, 0, 0], 
 [1, 0, 0, 0], 
 [0, 0, 1, 0], 
 [0, 0, 0, 1], 
 [1, 0, 0, 0], 
 [0, 0, 1, 0], 
 [0, 1, 0, 0]]

答案 1 :(得分:0)

简单的numpy解决方案,循环可能会被矢量化操作替换,以获得更好的性能。

您的测试用例中出现错误,第七行应为[0, 0, 0, 1]而不是[0, 1, 0, 1]

import numpy as np

n = np.matrix([2, 3, 4, 2, 1, 3, 4, 1, 3, 2])
expected = np.array([[0, 1, 0, 0],
                     [0, 0, 1, 0],
                     [0, 0, 0, 1],
                     [0, 1, 0, 0],
                     [1, 0, 0, 0],
                     [0, 0, 1, 0],
                     [0, 0, 0, 1],
                     [1, 0, 0, 0],
                     [0, 0, 1, 0],
                     [0, 1, 0, 0]])


def make_result(input_vector):
    output = np.zeros((input_vector.shape[1], np.max(input_vector)))
    for idx, value in enumerate(np.nditer(n)):
        output[idx, value - 1] = 1
    return output


result = make_result(n)
assert (expected == result).all()

答案 2 :(得分:0)

如果列数很少且行数很多,可能会更快地通过列。

import numpy as np
n=np.matrix('[2, 3, 4, 2, 1, 3, 4, 1, 3, 2]')
d=np.zeros((n.shape[1],4),dtype=int)
for j in range(4):
    d[:,j] = n==j+1  #  True->1, False ->0
print d

[[0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [0 1 0 0]
 [1 0 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]
 [0 0 1 0]
 [0 1 0 0]]