我对此矩阵有疑问:
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)矩阵????
答案 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]]