【发布时间】:2020-03-03 06:02:46
【问题描述】:
假设我有一个二维数据矩阵,我想将函数应用于该矩阵中的组。
例如:
对于每个唯一索引,我想应用一些函数f。
例如对于index = 1 的组,函数f 应用于值0.556, 0.492, 0.148(见第一列),对于index = 2 组,函数应用于值0.043。
另外:
- 该函数必须将结果广播到输入数据的原始大小。
- 每列的组都是唯一的。您可以在上面的示例中看到这一点,其中每个组仅包含同一列中的值。
那么在 Python 中执行此操作绝对最快的方法是什么?
我目前正在执行以下操作(随机数据 [2000x500] 和每列 5 个随机组):
import numpy as np
rows = 2000
cols = 500
ngroup = 5
data = np.random.rand(rows,cols)
groups = np.random.randint(ngroup, size=(rows,cols)) + 10*np.tile(np.arange(cols),(rows,1))
result = np.zeros(data.shape) # Pre-allocating the result
f = lambda x: (x-np.average(x))/np.std(x) # The function I want to apply
for group in np.unique(groups): # Loop over every unique group
location = np.where(groups == group) # Find the location of the data
group_data = data[location[0],location[1]] # Get the data
result[location[0],location[1]] = f(group_data) # Apply the function
使用我的硬件,这个计算大约需要 10 秒才能完成。有没有更快的方法来做到这一点?
【问题讨论】:
-
最快的方式可能取决于具体的
f。我们可以假设您的 sn-p 中的那个就是您需要的那个吗? -
@jdehesa 是的,为了回答这个问题,我们假设
f与问题中指定的一样。
标签: python performance numpy numpy-ndarray