【发布时间】:2021-12-15 04:42:26
【问题描述】:
我是 python 和堆栈溢出的新手。 如果客户存在于给定列表中,我需要创建一个值为 1 的二进制矩阵。 例如: 假设一个列表为 [4,5,8]。 我需要一个 10x10 矩阵,除 matrix[4,5]、matrix[5,4]、matrix[5,8]、matrix[8,5] 和 matrix[4,8]、matrix[8,4] 之外全为零是 1。 是否有捷径可寻? 谢谢。
【问题讨论】:
我是 python 和堆栈溢出的新手。 如果客户存在于给定列表中,我需要创建一个值为 1 的二进制矩阵。 例如: 假设一个列表为 [4,5,8]。 我需要一个 10x10 矩阵,除 matrix[4,5]、matrix[5,4]、matrix[5,8]、matrix[8,5] 和 matrix[4,8]、matrix[8,4] 之外全为零是 1。 是否有捷径可寻? 谢谢。
【问题讨论】:
你有:
data = [4, 5, 8]
你计算:
matrix = [[int(c in data and r in data and c != r) for c in range(10)] for r in range(10)]
你得到:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
上面显示的解决方案使用从零开始的索引。
【讨论】:
您可以使用numpy 作为矢量化而不使用for-loop,如下所示:
arr = [4,5,8]
idx = np.array(np.meshgrid(arr,arr)).T.reshape(-1,2)
#romove (4,4) , (5,5) , (8,8)
idx = idx[idx[:,0] != idx[:,1]]
mtx = np.zeros((10,10))
mtx[idx[:,0], idx[:,1]] = 1
print(mtx)
输出:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 1. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
【讨论】: