2014-10-20 146 views
3

我有一個陣列x,如下所示:切片1D陣列中numpy的無環

x=np.array(["83838374747412E61E4C202C004D004D004D020202C3CF", 
      "8383835F6260127314A0127C078E07090705023846C59F", 
      "83838384817E14231D700FAC09BC096808881E1C1BC68F", 
      "8484835C535212600F860A1612B90FCF0FCF012A2AC6BF", 
      "848484787A7A1A961BAC1E731086005D005D025408C6CF", 
      "8484845050620C300D500A9313E613E613012A2A5CC4BF", 
      "838383757C7CF18F02192653070D03180318080101BE6F", 
      "8584845557570F090E830F4309E5080108012A2A2AC6DF", 
      "85858453536B07D608B3124C102A102A1026010101C61F", 
      "83838384848411A926791C162048204820484D4444C3BF"], dtype=object) 

這些是我需要爲了轉換爲整數,然後應用轉換因子切片級聯的十六進制值。我想一個數組如:

[83,83,83,84,84,84,83,85,85,83] 

這將是x[:,0:2]等價,但我不能在這個(10,)陣列片。我正在嘗試做一些與MatLab中的字符數組類似的功能。我將在數百萬行上做這個,這就是爲什麼我要避免循環。

+0

「x」數組的行之間是否有任何'逗號'丟失? – Dalek 2014-10-20 19:28:29

+1

是的,謝謝你。 – user3338505 2014-10-21 14:13:56

回答

0

如果你只是每個十六進制值的前兩個字符後,一個選擇是你的陣列重鑄'|S2'dtype

>>> x.astype('|S2') 
array(['83', '83', '83', '84', '84', '84', '83', '85', '85', '83'], 
    dtype='|S2') 

這個想法可以推廣到返回第一個字符n來自每個字符串。

任意切分字符串數組在NumPy中要困難得多。在this Stack Overflow page上的答案解釋了爲什麼它不是字符串的最佳工具,但顯示什麼是可能的。

或者,Pandas庫有助於快速向量化操作(建立在NumPy之上)。它有一些非常有用的字符串操作,這使得切片比普通NumPy的簡單一大堆:

>>> import pandas as pd 
>>> s = pd.Series(x) 
>>> s.str.slice(2, 9) 
0 8383747 
1 83835F6 
2 8383848 
3 84835C5 
4 8484787 
5 8484505 
6 8383757 
7 8484555 
8 8584535 
9 8383848 
dtype: object 
+0

謝謝,這正是我在尋找的片斷謝謝你!這與之相結合; intHex =矢量化(INT) xIntForm = intHex(xArray,16) 在熊貓系列將其轉換/ – user3338505 2014-10-21 14:20:51

+0

@ user3338505沒問題,很高興事情成功的! – 2014-10-21 19:14:37

0

這裏是做這件事的Python的方式

考慮您的字符串的一部分

x = "83838374747412E61E4C202C004D004D004D020202C3CF8383835F626012" 

您可以結合mapjoinzipiter,使其工作

xArray = array(map(''.join, zip(*[iter(x)]*2))) 

然後,您可以通過使用INT

intHex = vectorize(int) 
xIntForm = intHex(xArray,16) 

一個量化的形式,我不知道的vectorize功能的性能,雖然,這是numpy的一部分處理您將您的十六進制值的整數。

乾杯

+0

感謝您的幫助,我使用上面的熊貓方法,然後使用矢量化進行轉換。 – user3338505 2014-10-21 14:22:10