从 Python 数组创建 NxM 索引

Creating NxM indices from a Python array

我想采用 NxM 矩阵,为简单起见,我们将使用

x=np.arange(25).reshape((5,5))

我想创建一个新矩阵 A,我可以在其中为第一行中的每个元素存储一个节点,第二行中存储它的 N 方向索引,第三行中存储它的 M 方向索引行,以及第四行中的元素实际值。但是,我很难找到如何创建一个可以容纳所有这些值的容器,而无需提前知道它们的确切长度(如在最终脚本中,如果开始矩阵中的某些节点在临界点) 因此,例如,可能是这样的: (使用 networkx 作为 graph/node 方法,文档:http://networkx.github.io/

import networkx as nx
import numpy as np
A=[]
g=nx.Graph()
x2=np.ravel(x,order='C')
for k in x2:
    A[0,:]=g.add_node(k)
    A[3,:]=x2[k]

for i in length(x):
    for j in height(x):#also not sure how to return height/number of sub arrays
        x[i]=A[1,:]
        x[j]=A[2,:]

来自您的评论:

x = np.arange(25).reshape((5,5)) 
A = [[node0,node1,...node24], 
     [column index for each node above from 0 to 24], 
     [row index for each node from 0 to 24], 
     [value for each node from 0 to 24]]

收集此类信息的一种简单方法是像这样循环

A = []
for i in range(x.shape[0]):
    for j in range(x.shape[1]):
        if x[i,j] too small:
             continue
        a='node(%s,%s)'%(i,j),i,j,x[i,j]
        A.append(a)

生成元组列表,如:

[('node(0,0)', 0, 0, 0),
 ('node(0,1)', 0, 1, 1),
 ('node(0,2)', 0, 2, 2),
 ('node(0,3)', 0, 3, 3),
 ...
 ]

可以用

变成结构化数组
M=np.array(A,dtype='O,i,i,f')

array([('node(0,0)', 0, 0, 0.0), ('node(0,1)', 0, 1, 1.0),
       ('node(0,2)', 0, 2, 2.0), ('node(0,3)', 0, 3, 3.0),
       ('node(0,4)', 0, 4, 4.0), ('node(1,0)', 1, 0, 5.0),
       ('node(1,1)', 1, 1, 6.0), ('node(1,2)', 1, 2, 7.0),
       ....
       ('node(4,4)', 4, 4, 24.0)], 
      dtype=[('f0', 'O'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4')])

可以使用 M['f3'] 等访问字段

[M['f0'],M['f1'],M['f2'],M['f3']] 生成 A 列表 - 数组列表。

制作包含 4 个列表的列表的更直接方法:

A = [[],[],[],[]]
for i in range(x.shape[0]):
    for j in range(x.shape[1]):
        A[0].append('node(%s,%s)'%(i,j))
        A[1].append(i)
        A[2].append(j)
        A[3].append(x[i,j])

你也可以循环遍历乱七八糟的 x,但你必须以另一种方式推断坐标。