用于在2D numpy数组中映射列内容的优化方法

时间:2019-01-30 05:51:59

标签: python numpy mapping line-profiler

我有一个numpy二维数组,其中包含0到100之间的整数。对于特定的列,我想按以下方式映射值:

import numpy as np
@profile
def map_column(arr,col,incr):
    col_data = arr[:,col]
    vec = np.arange(0,100,incr)
    for i in range(col_data.shape[0]):
        for j in range(len(vec)-1):
            if (col_data[i]>=vec[j] and col_data[i]<vec[j+1]):
                col_data[i] = vec[j]
        if (col_data[i]>vec[-1]):
            col_data[i] = vec[-1]
    return col_data

np.random.seed(1)
myarr = np.random.randint(100,size=(80000,4))
x = map_column(myarr,2,5)

这是我的代码:

Timer unit: 1e-06 s
Total time: 8.32155 s
File: testcode2.py
Function: map_column at line 2
Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                           @profile
     3                                           def map_column(arr,col,incr):
     4         1         17.0     17.0      0.0      col_data = arr[:,col]
     5         1         34.0     34.0      0.0      vec = np.arange(0,100,incr)
     6     80001     139232.0      1.7      1.7      for i in range(col_data.shape[0]):
     7   1600000    2778636.0      1.7     33.4          for j in range(len(vec)-1):
     8   1520000    4965687.0      3.3     59.7              if (col_data[i]>=vec[j] and col_data[i]<vec[j+1]):
     9     76062     207492.0      2.7      2.5                  col_data[i] = vec[j]
    10     80000     221693.0      2.8      2.7          if (col_data[i]>vec[-1]):
    11      3156       8761.0      2.8      0.1              col_data[i] = vec[-1]
    12         1          2.0      2.0      0.0      return col_data

此代码需要8.3秒才能运行。以下是在此代码上运行line_profiler的输出。

git status

将来,我必须处理比这个大得多的真实数据。 有人可以建议一种更快的方法吗?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,我认为可以用算术表达式解决:

def map_column(arr,col,incr):
    col_data = arr[:,col]
    return (col_data//incr)*incr

应该可以解决问题。这里发生的是由于整数除法,其余部分被丢弃。因此,再次将其乘以增量,就可以得到下一个较小的数字,该数字可以被该增量整除。