【发布时间】:2018-01-08 06:44:58
【问题描述】:
假设我有一个数组X 和一个索引列表k_ar,其中最大值是K - 1。
我想要做的基本上是以X[i] 进入子数组k_ar[i] 的方式拆分X。 O(n) 的方法如下:
X = [5, 1, 3, 2, 2, 1]
k_ar = [0, 1, 0, 1, 2]
K = max(k_ar) + 1
sub_X = [[] for k in range(K)]
for k, x in zip(k_ar, X):
sub_X[k].append(x)
虽然这是做这类事情的理想算法,但我想知道 Numpy、Scipy 或任何其他库是否有更快的方法来做这件事。例如,我可以这样做,但它是 O(nK) 而不是 O(n),因此对于大型 K 来说不是最佳的,尽管在 n 中非常快:
import numpy as np
X = np.ndarray([5, 1, 3, 2, 2, 1], dtype=np.int8)
k_ar = np.ndarray([0, 1, 1, 0, 1, 2], dtype=np.int8)
K = max(k_ar)
sub_X = np.empty(K, dtype=np.ndarray)
for k in range(K):
sub_X[k] = X[k_ar == k]
那么,有没有一种方法可以在不使用例如的情况下加快速度? Numba、Cython 还是 PyPy?
【问题讨论】:
-
第一个例子看起来不错。顺便说一句,第二个示例需要
np.array。