令x,y,z为矩阵表示,使得(x [i,j],y [i,j],z [i,j])对应于某个点。
我们想要只有一个变量(Points)而不是3个变量,其中“Points [i,j] =(x [i,j],y [i,j],z [i,j])”和“Points [i,j,0] = x [i,j]”
示例:
import numpy as np
x = np.array([[1, 1],
[2, 2]])
y = np.array([[1, 2],
[1, 2]])
z = np.array([[3, 4],
[5, 6]])
Points = np.array([[ [1, 1, 3], [1, 2, 4] ],
[2, 1, 5], [2, 2, 6] ]])
目前我已经想到了一些解决方案:
第一个解决方案:
from itertools import izip
Temp_List=[]
for xi, yi, zi in izip(x, y, z):
Temp_List.append([(xij, yij, zij) for xij, yij, zij in izip(xi, yi, zi)])
Points=np.array(Temp_List)
我知道拆开一个元组再打包它不是很聪明,但是 为了使其更具可读性并准备下一个解决方案
第二个解决方案:#one-liner
from itertools import izip
Points=np.array([zip(xi, yi, zi) for xi, yi, zi in izip(x,y,z)])
我真的很喜欢这个选项。但是在这个解决方案中,我关注可读性。也许只是我,但我觉得列表理解产生类似于示例中的点的东西并不明显。除非你熟悉izip和zip之间的区别。
很明显,另一种解决方案是使用索引迭代元素x,y和z,就像在其他语言中一样(对于x in xrange(...):对于x in xrange(...)中的j:做东西...... )
结论: 是否有另一种方法使用numpy函数(或不提供)从x,y,z生成Points变量,从而提高可读性,内存消耗或性能?
答案 0 :(得分:2)
您可以使用numpy的stack
函数:
import numpy as np
x = np.array([
[1, 1],
[2, 2],
])
y = np.array([
[1, 2],
[1, 2],
])
z = np.array([
[3, 4],
[5, 6],
])
points = np.stack([x, y, z], axis=2)
带有stack
关键字的 axis
会取代现已弃用的旧vstack
,hstack
和dstack
函数。