Pythonic替代R的矢量化函数

时间:2016-01-06 22:10:48

标签: python loops vectorization

我在Python工作,但是来自R背景 - 如果我想获取字符串数组x = ['1', '2', '3']并获得相应的整数数组[1, 2, 3],那么要做的事情就是运行int(x)之类的东西。当然,这种语法不起作用,因为我在Python中并且函数没有自动矢量化。好像我可以使用NumPy来创建一个矢量化的函数版本,但感觉就像用非常重的R口音说Python。

循环使用矢量的内容

x2 = []
for y in x:
    x2.append(int(y))

但似乎并不优雅 - 它是一个三线结构,我可以用R中的六个角色做一些事情。当然,有一个Pythonic的方法来做到这一点,还有更多紧凑?或者这是否与Python与R的优势和劣势相对应?

4 个答案:

答案 0 :(得分:3)

您应该使用numpy库,以及可能使用基于它的其他库,例如pandas。如果您想要做的是矢量化数值运算,那么这就是实现它的方法。

你正确地对抗这两种语言的优点和缺点。在R中,一切都是矢量,甚至是单个数值。这使得矢量化操作变得容易,但是当你不希望进行矢量化数值计算时,可能会做任何事情都很尴尬。由于没有将向量化等内容构建到核心语言类型中,Python具有更大的灵活性;你仍然可以做到,但你需要一个图书馆

换句话说,R的优势在于一切都是矢量化的,而一个弱点就是一切都是矢量化的; Python的优势在于默认情况下没有向量化的东西,缺点是默认情况下没有向量化。使用numpy进行矢量化操作并不是很多" Python带有R重音" as" Python带有矢量重音",如果你想要矢量化操作,这正是你想要的。如果您正在做很多统计数据,您可能会发现R的优势很有帮助。根据我的经验,如果您几乎不做任何事情,那么您会发现Python更适合各种任务。

答案 1 :(得分:3)

您可以使用map

>>> lst = ['1', '2', '3']
>>> map(int, lst)
[1, 2, 3]

或列表理解:

>>> [int(x) for x in lst]
[1, 2, 3]

使用哪一个?主要是基于意见。就个人而言,如果映射的函数已经作为内置函数存在,我更喜欢map

请注意,在Python3中,map将生成一个地图对象,如果您想要一个列表,则必须明确地转换为列表。所以在Python3中可能更喜欢理解:

>>> result = map(int, ['1', '2', '3'])
>>> result
<map object at 0x7f35c4c3af98>
>>> list(result)
[1, 2, 3]

答案 2 :(得分:1)

您可以使用列表理解:

x = ['1', '2', '3']
l = [int(i) for i in x]
print(l)
[1, 2, 3]

如果您打算使用复杂的向量,数据帧,您应该检查numpypandasscipy库。

答案 3 :(得分:1)

我强烈建议您使用numpy来处理矢量数据。这正是它的用途。它是一个非常成熟的库,被其他库广泛使用,与“以非常重的R口音讲Python”无关。

此特定示例的替代方案是列表理解:

[int(e) for e in x]