Doc*_*r J 5 python arrays sorting numpy
我有一个数组,确定元素的排序:
order = [3, 1, 4, 2]
Run Code Online (Sandbox Code Playgroud)
然后我想要排序另一个更大的数组(仅包含那些元素):
a = np.array([4, 2, 1, 1, 4, 3, 1, 3])
Run Code Online (Sandbox Code Playgroud)
这样首先出现的元素order
在结果中排在第一位,等等.
在Python中,我会用一个关键函数来做:
sorted(a, key=order.index)
[3, 3, 1, 1, 1, 4, 4, 2]
Run Code Online (Sandbox Code Playgroud)
如何(有效地)使用numpy这样做?numpy数组是否有类似的"关键功能"概念?
Ints
因为ints
,我们可以使用bincount
-
np.repeat(order,np.bincount(a)[order])
Run Code Online (Sandbox Code Playgroud)
样品运行 -
In [146]: sorted(a, key=order.index)
Out[146]: [3, 3, 1, 1, 1, 4, 4, 2]
In [147]: np.repeat(order,np.bincount(a)[order])
Out[147]: array([3, 3, 1, 1, 1, 4, 4, 2])
Run Code Online (Sandbox Code Playgroud)
方法#1
推广所有dtypes bincount
-
# https://stackoverflow.com/a/41242285/ @Andras Deak
def argsort_unique(idx):
n = idx.size
sidx = np.empty(n,dtype=int)
sidx[idx] = np.arange(n)
return sidx
sidx = np.argsort(order)
c = np.bincount(np.searchsorted(order,a,sorter=sidx))
out = np.repeat(order, c[argsort_unique(sidx)])
Run Code Online (Sandbox Code Playgroud)
方法#2-A
有np.unique
和searchsorted
所有元素order
都在的情况a
-
unq, count = np.unique(a, return_counts=True)
out = np.repeat(order, count[np.searchsorted(unq, order)])
Run Code Online (Sandbox Code Playgroud)
方法#2-B
为了涵盖所有情况,我们需要一个额外的步骤 -
unq, count = np.unique(a, return_counts=1)
sidx = np.searchsorted(unq, order)
out = np.repeat(order, np.where(unq[sidx] == order,count[sidx],0))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
169 次 |
最近记录: |