假设我有一个数组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'作为第二个例子BTW。 –