2013-03-29 5 views
5
import numpy as np 
data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d']) 

मैं इसNumpy पूर्णांकों संवर्द्धित

data = np.array([0,0,0,1,1,1,1,2,2,3,3,3]) 

मैं एक numpy समाधान


के लिए देख रहा हूँ की तरह संवर्द्धित एक पूर्णांक के साथ तार के प्रत्येक समूह प्रतिस्थापित करने की आवश्यकता के साथ तत्वों की समूहों की जगह इस डेटासेट के साथ http://www.uploadmb.com/dw.php?id=1364341573

import numpy as np 
f = open('test.txt','r') 
lines = np.array([ line.strip() for line in f.readlines() ]) 
lines100 = lines[0:100] 
_, ind, inv = np.unique(lines100, return_index=True, return_inverse=True) 
print ind 
print inv 
nums = np.argsort(ind)[inv] 
print nums 

[ 0 83 62 40 19] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4] 

lines200 = lines[0:200] 
_, ind, inv = np.unique(lines200, return_index=True, return_inverse=True) 
print ind 
print inv 
nums = np.argsort(ind)[inv] 
print nums 
[167 0 83 124 104 144 185 62 40 19] 
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 
9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 
4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5 5 5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6] 
[9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 
6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 4 4 4 
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] 

उत्तर

3

संपादित करें: यह हमेशा काम नहीं करता है:

>>> a,b,c = np.unique(data, return_index=True, return_inverse=True) 
>>> C# almost!!! 
array([1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 3, 3]) 
>>> np.argsort(b)[c] 
array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3], dtype=int64) 

लेकिन यह काम करता है:

def replace_groups(data): 
    a,b,c, = np.unique(data, True, True) 
    _, ret = np.unique(b[c], False, True) 
    return ret 

और शब्दकोश प्रतिस्थापन दृष्टिकोण की तुलना में तेजी, के बारे में 33 बड़े डेटासेट के लिए% है:

def replace_groups_dict(data): 
    _, ind = np.unique(data, return_index=True) 
    unqs = data[np.sort(ind)] 
    data_id = dict(zip(unqs, np.arange(data.size))) 
    num = np.array([data_id[datum] for datum in data]) 
    return num 

In [7]: %timeit replace_groups_dict(lines100) 
10000 loops, best of 3: 68.8 us per loop 

In [8]: %timeit replace_groups_dict(lines200) 
10000 loops, best of 3: 106 us per loop 

In [9]: %timeit replace_groups_dict(lines) 
10 loops, best of 3: 32.1 ms per loop 

In [10]: %timeit replace_groups(lines100) 
10000 loops, best of 3: 67.1 us per loop 

In [11]: %timeit replace_groups(lines200) 
10000 loops, best of 3: 78.4 us per loop 

In [12]: %timeit replace_groups(lines) 
10 loops, best of 3: 23.1 ms per loop 
+0

के लिए 'डेटा = np.array ([3,1,2])' काम नहीं करता (संविधान मैं के बारे में सोच सकते हैं एक प्रतिस्थापन शब्दकोश है मेरे उत्तर पर @ डीएसएम की टिप्पणी देखें) – askewchan

+1

@askewchan अजीब, मैं अभी भी पूरी तरह से समझ नहीं पा रहा हूं कि हम दोनों कभी-कभी विचार क्यों करते थे, लेकिन कभी-कभी ऐसा नहीं होता ... ऐसा लगता है कि यह थोड़ा तेज़ है, ऐसा करने के लिए आपके पुन: प्लेसमेंट शब्दकोश की बजाय 'np.unique' पर दूसरी कॉल, मेरा संपादन देखें। – Jaime

+0

मुझे दोनों समाधान पसंद हैं। मैं इसे स्वीकार करता हूं क्योंकि यह शुद्ध सुस्त और तेज है। हालांकि, मैं इसे पूरी तरह समझ नहीं पा रहा हूं। क्या आप एक संक्षिप्त स्पष्टीकरण लिख सकते हैं? – siamii

3

@ डीएसएम की यह देखते हुए कि मेरा मूल विचार मजबूत रूप से काम नहीं करता है, सबसे अच्छा सोल

data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d']) 
_, ind = np.unique(data, return_index=True) 
unqs = data[np.sort(ind)] 
data_id = dict(zip(unqs, np.arange(data.size))) 
num = np.array([data_id[datum] for datum in data]) 

माह डेटा के लिए:

In [5]: f = open('test.txt','r') 

In [6]: data = np.array([line.strip() for line in f.readlines()]) 

In [7]: _, ind, inv = np.unique(data, return_index=True) 

In [8]: months = data[np.sort(ind)] 

In [9]: month_id = dict(zip(months, np.arange(months.size))) 

In [10]: np.array([month_id[datum] for datum in data]) 
Out[10]: array([ 0, 0, 0, ..., 41, 41, 41]) 
+0

यदि आपके पास अभी भी अंतिम बार से मेरा टेस्ट डेटा है, तो क्या आप इसे इसके साथ देख सकते हैं? मेरा मानना ​​है कि np.argsort में एक और बग है। – siamii

+0

सभी महीने? क्या आपने कभी numpy अपग्रेड किया था? – askewchan

+0

मैंने स्रोत में बग तय किया है, क्योंकि अब मैं अपग्रेड नहीं कर सकता, इसलिए महीनों को सही तरीके से वापस कर दिया गया है। यह – siamii