从 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
,但你必须以另一种方式推断坐标。
我想采用 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
,但你必须以另一种方式推断坐标。