2017-09-17 38 views
1

设x,y,z为矩阵表示,使得(x [i,j],y [i,j],z [i ,j])对应某个点。Numpy:给定每个坐标矩阵分别构造点矩阵的替代方法

不是有3个变量,我们只想要一个变量(点),其中“点[i,j] =(x [i,j],y [i,j],z [i,j]) “和 ”点[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) 

我知道拆包元组收拾一遍是不是很聪明,但 为使其更具可读性,并准备下一个解决方案

第二个解决方案的缘故:#一个班轮

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,就像在其他语言中一样(对于我在xrange(...)中:对于在xrange(...)中的j:do stuff .. )

结论: 是否有另一种方法使用numpy函数(或不是)来改进可读性,内存消耗或性能,从x,y,z生成Points变量?

+1

只需使用:'np.dstack((x,y,z))'? – Divakar

+0

旧的'dstack','hstack'和'vstack'函数现在不赞成使用'stack'。在这种情况下'np.stack([x,y,z],axis = 2)' – MaxNoe

+0

感谢这两个答案,正是我一直在寻找的!我对numpy还不是很熟悉。此外,我已经运行了一些测试,对于小型矩阵,性能大致相同,但是当使用更大的矩阵时,np.stack会压倒其他解决方案。从我在其他问题中读到的内容来看,它也应该更有记忆效率 –

回答

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) 

stackaxis关键字新陈代谢vstackhstackdstack功能,目前已过时。