Numpy:分别给出每个坐标的矩阵构建点矩阵的替代方法

时间:2017-09-17 20:02:06

标签: python numpy matrix coordinates

令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变量,从而提高可读性,内存消耗或性能?

1 个答案:

答案 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会取代现已弃用的旧vstackhstackdstack函数。