如何更有效地为numpy数组添加点?

时间:2015-07-27 23:35:45

标签: python arrays loops numpy optimization

我对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

其中XY是每行不同的标量,其中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

0 个答案:

没有答案