2014-10-20 102 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