0

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

0-4 mapped to 0
5-9 mapped to 5
10-14 mapped to 10, and so on.

这是我的代码:

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)

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

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

将来我必须使用比这个大得多的真实数据。谁能建议一种更快的方法来做到这一点?

4

1 回答 1

2

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

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

应该做的伎俩。这里发生的是由于整数除法,余数被丢弃。因此,再次乘以增量,您会得到下一个可被增量整除的较小数字。

于 2019-01-30T06:01:49.870 回答