在没有循环的Numpy中切片1D数组

时间:2014-10-20 17:54:24

标签: python arrays numpy vectorization slice

我有一个数组x,如下所示:

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中字符数组的操作。我将在数百万行中执行此操作,这就是我试图避免循环的原因。

2 个答案:

答案 0 :(得分:0)

如果您只是在每个十六进制值的前两个字符之后,一个选项是将您的数组重新设置为dtype '|S2'

>>> 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

答案 1 :(得分:0)

这是一种pythonic方式

考虑部分字符串

x = "83838374747412E61E4C202C004D004D004D020202C3CF8383835F626012"

您可以合并mapjoinzipiter以使其有效

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

然后,您可以使用向量化形式的int

处理将十六进制值转换为整数
intHex   = vectorize(int)
xIntForm = intHex(xArray,16)

我不确定vectorize函数的性能,但这是numpy的一部分。

干杯