我有一个2D的Numpy数组 arr。它相当大:arr.shape = (2400, 60000)
我目前正在做以下操作:
- 随机(有放回地)选择
arr.shape[0]
个索引 - 访问所选的
arr
索引(按行) - 计算逐列平均值并选择最大值
- 我重复进行 k 次
看起来像这样:
no_rows = arr.shape[0]
indicies = np.array(range(no_rows))
my_vals = []
for k in range(no_samples):
random_idxs = np.random.choice(indicies, size=no_rows, replace=True)
my_vals.append(
arr[random_idxs].mean(axis=0).max()
)
我的问题是速度非常慢。对于我的arr
大小,每次循环需要约3秒钟。由于我想要一个大于1k的样本,我的当前解决方案非常糟糕(1k*~3s -> ~1h)。我已经对其进行了分析,发现基于索引访问行是瓶颈所在。"mean"
和"max"
快速处理。np.random.choice也没问题。
你有看到任何可以改进的地方吗?是否有更有效率的方法来访问索引,或者更好的快速解决此问题的方法?
我尝试过的方法:
- numpy.take (较慢)
- numpy.ravel :
类似以下的东西:
random_idxs = np.random.choice(sample_idxs, size=sample_size, replace=True)
test = random_idxs.ravel()[arr.ravel()].reshape(arr.shape)
- 采用类似现有方法的方式,但不使用循环。我创建了一个三维数组,并通过额外的维度一次性访问行。
no_samples
是什么意思? - Fallen Apart