2017-05-23 190 views
1

如果我有擴展基於標籤

a1 = np.array([1,2,3,4]) 
a2 = np.array(list('abcd')) 
b2 = np.array(list('aabcccdd')) 

numpy的陣列我怎麼到B1這應該是

array([1, 1, 2, 3, 3, 3, 4, 4]) 

編輯:換句話說,a1值對應於a2「標籤」和我想要生成對應於b2的值。

+1

我認爲人們會很容易混淆與具有'b2'簡單地擴展「雙」爲每一個元素的樣本。或者你真的有這樣一個簡單的實際案例嗎? – Divakar

+0

不,你說得對。我會編輯它更清晰 – Tony

+0

只是,使用更有代表性的示例。 – Divakar

回答

1

假設a2進行排序,在這裏,人們使用np.searchsorted是 -

a1[np.searchsorted(a2,b2)] 

採樣運行 -

In [145]: a1 = np.array([1,2,3,4]) 
    ...: a2 = np.array(list('abcd')) 
    ...: b2 = np.array(list('aabbccdd')) 
    ...: 

In [146]: a1[np.searchsorted(a2,b2)] 
Out[146]: array([1, 1, 2, 2, 3, 3, 4, 4]) 

因爲當a2沒有排序,我們需要在sorter參數帶來的一般情況 -

In [148]: np.random.shuffle(a2) 

In [149]: a2 
Out[149]: 
array(['b', 'd', 'c', 'a'], 
     dtype='|S1') 

In [152]: sidx = a2.argsort() 

In [155]: a1[sidx[np.searchsorted(a2,b2, sorter=sidx)]] 
Out[155]: array([4, 4, 1, 1, 3, 3, 2, 2]) 
1

個Numpys內置函數numpy.repeatnumpy.tile非常適合這種工作。

例子:

import numpy as np 
arr = np.array((1, 2, 3, 4)) 
print(arr) 
[1, 2, 3, 4] 

print(numpy.repeat(arr, 2)) 
[1, 1, 2, 2, 3, 3, 4, 4] 

print(numpy.tile(arr, 2)) 
[1, 2, 3, 4, 1, 2, 3, 4] 
+0

所以,你實際上不需要'a2'或'b2'? :) – Divakar

+0

如果你只是想重複任何給定的數組,我會說不。 –

+0

感謝您的回覆,但那不是我之前的想法。請看我編輯的OP。我錯誤地認爲這是顯而易見的。 Divakar的解決方案工作得很好。 – Tony