使用3个向量作为矩阵中的列

时间:2014-11-20 01:28:52

标签: python scipy

我意识到这应该很简单,但是我有一个大型数据集(14k点),而且我的编码方式是我的愚蠢新内存问题。

因此。我有三个有序列表,xnew是x坐标,ynew是y坐标,znew是z坐标。我想要一个数组,其中每一行是一个点,分别有三列,x,y和z。首先我尝试了这个:

points = []    
for point_number in range(len(xnew)):
    points.append((xnew[point_number], ynew[point_number], 
                  znew[point_number]))
    xyz_out = np.array(points)

适用于我的数据的一小部分,但不适用于整个事情。

现在,我有这个:

xyz_out = np.array([xnew, ynew, znew])
xyz_out.transpose((1, 0))
return xyz_out

由于某些原因,即使看起来它应该来自转置文档,也不会转置我的数据。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

尝试column_stack

xyz = np.column_stack((xnew, ynew, znew))

答案 1 :(得分:0)

创建矩阵的另一种方法是利用内置的zip函数:

In [1]: import numpy as np
In [2]: xnew, ynew, znew = range(1000), range(1000), range(1000)
In [3]: xyz = np.array(zip(xnew, ynew, znew))
In [4]: xyz[1, :]
Out[4]: array([1, 1, 1])
In [5]: xyz[2, :]
Out[5]: array([2, 2, 2])

zip会将每个坐标向量的第i个值组合成元组,如下所示:

>>> zip(xnew, ynew, znew)[0]
(0, 0, 0)

这样可以轻松转换为numpy.array

答案 2 :(得分:0)

大多数numpy方法只返回一个视图,并且不会修改该对象。有关详细信息,请参阅this question和其他许多人。考虑:

import numpy as np
xnew, ynew, znew = range(1000), range(1000), range(1000)
xyz_out = np.array([xnew, ynew, znew])
xyz_out.transpose((1, 0))

最后一行只为您提供了xyz_out数组转置的视图。 你可以指定它:

xyz_out = xyz_out.transpose((1, 0))

现在它会起作用。在像你这样的2D情况下,只需编写xyz_out = xyz_out.T进行转置。


numpy转置也比zip快4或5倍。

%%timeit
xyz_out = np.array([xnew, ynew, znew])
xyz_out = xyz_out.T

%%timeit
xyz_out = np.array(zip(xnew, ynew, znew))