如何使用 2D numpy 数组中的逻辑条件从 3D 列表精确/分配值



我被有关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的操作与另一对的操作无关。

相关内容

  • 没有找到相关文章

最新更新