我有一个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
将来,我必须处理比这个大得多的真实数据。 有人可以建议一种更快的方法吗?
答案 0 :(得分:2)
如果我正确理解了这个问题,我认为可以用算术表达式解决:
def map_column(arr,col,incr):
col_data = arr[:,col]
return (col_data//incr)*incr
应该可以解决问题。这里发生的是由于整数除法,其余部分被丢弃。因此,再次将其乘以增量,就可以得到下一个较小的数字,该数字可以被该增量整除。