我对python很新,所以我还不知道所有的提示和技巧。但是我试图从文件中逐行读取数据,然后读入numpy数组。我必须以这种方式逐行阅读,但在将数据移入数组时我有自由。以下是相关代码:
xyzi_point_array = np.zeros((0,4))
x_list = []
y_list = []
z_list = []
i_list = []
points_read = 0
while True: #FOR EVERY LINE DO:
line = decryptLine(inFile.readline()) #grabs the next line of data
if not line: break
.
.
.
index = 0
for entry in line: #FOR EVERY VALUE IN THE LINE
x_list.append(X)
y_list.append(Y)
z_list.append(z_catalog[index])
i_list.append(entry)
index += 1
points_read += 1
xyzi_point_array = np.zeros((points_read,4))
xyzi_point_array[:,0] = x_list
xyzi_point_array[:,1] = y_list
xyzi_point_array[:,2] = z_list
xyzi_point_array[:,3] = i_list
其中X
和Y
是每行不同的标量,其中z_catalog
是1D numpy数组。
对于较小的数据集,嵌入式for循环是最大的吸引力,xyzi_point_array[points_read,:] =
行占用了大部分处理器时间。但是,对于较大的数据集,使用tempArr
扩展xyzi_point_array
会变得最糟糕,因此我需要对两者进行优化。
有什么想法吗?关于如何更好地处理numpy数组的一般提示也是受欢迎的,我来自C ++背景,可能不是以最pythonic的方式处理这些数组..
作为参考,这里是代码的这一位的lineprofiler读数:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
138 150 233 1.6 0.0 index = 0
139 489600 468293 1.0 11.6 for entry in line: #FOR EVERY VALUE IN THE LINE
140 489450 457227 0.9 11.4 x_list.append(lineX)
141 489450 441687 0.9 11.0 y_list.append(lineY)
142 489450 541891 1.1 13.5 z_list.append(z_catalog[index])
143 489450 450191 0.9 11.2 i_list.append(entry)
144 489450 421573 0.9 10.5 index += 1
145 489450 408764 0.8 10.2 points_read += 1
146
149 1 78 78.0 0.0 xyzi_point_array = np.zeros((points_read,4))
150 1 39539 39539.0 1.0 xyzi_point_array[:,0] = x_list
151 1 33876 33876.0 0.8 xyzi_point_array[:,1] = y_list
152 1 48619 48619.0 1.2 xyzi_point_array[:,2] = z_list
153 1 47219 47219.0 1.2 xyzi_point_array[:,3] = i_list