我被有关python列表的值分配/提取问题阻止了。我有一个存储在 numpy 数组中的连接矩阵:
conn = np.array([[0, 1, 0], [1, 0, 3], [0, 3, 0]])
我接下来要实现的是:首先,创建一个 3D 列表path
其中 ith, jth 元素设置为长度conn[i, j]
的列表。为了说明,
path = [ [[] for kk in range(3)] for k in range(3)]
(idx_x, idx_y) = np.nonzero(conn)
non_zero_values = conn[np.nonzero(conn)]
for iter in range(len(non_zero_values)):
path[idx_x[iter]][idx_y[iter]] = [0 for k in range(non_zero_values[iter])]
其次,删除列表的最后一个值 ith,第 j 个位置的path
exit_matrix = np.zeros((3, 3))
for iter in range(len(non_zero_values)):
exit_matrix[idx_x[iter], idx_y[iter]] = path[idx_x[iter]][idx_y[iter]].pop()
第三,在列表开头插入一个值,第 j 个位置path
:
enter_matrix = np.array([[0, 4, 0], [2, 0, 1], [0, 3, 0]])
for iter in range(len(non_zero_values)):
path[idx_x[iter]][idx_y[iter]].insert(0, enter_matrix[idx_x[iter], idx_y[iter]])
有没有有效的方法来实现这一目标?您的任何建议将不胜感激。我是蟒蛇的新手。
非常感谢您抽出时间阅读我的问题..
zip
可以替换iter
循环,并使它们更易于阅读(但可能不会更快(:
for iter in range(len(non_zero_values)):
path[idx_x[iter]][idx_y[iter]] = [0 for k in range(non_zero_values[iter])]
for i,j,v in zip(idx_x, idx_y, non_zero_values):
path[i][j] = [0 for k in range(v)]
In [516]: conn = np.array([[0, 1, 0], [1, 0, 3], [0, 3, 0]])
In [517]: path = [ [[] for kk in range(3)] for k in range(3)]
...: (idx_x, idx_y) = np.nonzero(conn)
...: non_zero_values = conn[np.nonzero(conn)]
...:
In [518]: for i,j,v in zip(idx_x, idx_y, non_zero_values):
...: path[i][j] = [0 for k in range(v)]
...:
In [519]: path
Out[519]: [[[], [0], []], [[0], [], [0, 0, 0]], [[], [0, 0, 0], []]]
这些内部列表的可变长度强烈表明我们无法避免列表迭代。 可变长度不能很好地与矩形多维数组进行网格划分。
我要考虑的另一件事是定义一个函数来合并每个i,j
对的操作。 也就是说,在一个循环中进行初始化、弹出和插入。 快速浏览表明,一对i,j
的操作与另一对的操作无关。