我意识到这应该很容易,但我有一个很大的数据集(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
出于某种原因,它不会转置我的数据,尽管它看起来应该是转置文档中的数据。有什么建议吗?
发布于 2014-11-20 11:10:15
xyz = np.column_stack((xnew, ynew, znew))
发布于 2014-11-20 09:32:16
创建矩阵的另一种方法是利用内置的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
变得很容易。
发布于 2014-11-20 10:06:31
大多数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))
https://stackoverflow.com/questions/27030218
复制相似问题