R 向量化函数的 Pythonic 替代方案

Emp*_*cer 6 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))
Run Code Online (Sandbox Code Playgroud)

但看起来一点也不优雅——它是一个三行结构,我可以在 R 中用六个字符完成一些事情。当然有一种更紧凑的 Pythonic 方法可以做到这一点?或者这是否与 Python 和 R 各自的优缺点相抵触?

Bre*_*arn 5

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

您在某种程度上是对的,您正在讨论两种语言的优点和缺点。在 R 中,一切都是向量,甚至是单个数值。这使得矢量化操作变得容易,但可能会让你做任何你不做的事情变得尴尬。Python 具有更大的灵活性,因为它没有将矢量化之类的东西构建到核心语言类型中;你仍然可以这样做,但你需要一个图书馆

换句话说,R的优点是一切都是向量化的,缺点是一切都是向量化的;Python 的优点是默认情况下不会矢量化,缺点是默认情况下不会矢量化。使用 numpy 进行向量化运算与其说是“带有 R 口音的 Python”,不如说是“带有向量口音的 Python”,如果你想要向量化运算,这正是你想要的。如果您进行大量统计,您可能会发现 R 的优势很有帮助。根据我的经验,如果您几乎只做统计以外的任何事情,您会发现 Python 更适合各种任务。


tim*_*geb 5

您可以使用map

>>> lst = ['1', '2', '3']
>>> map(int, lst)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

或列表理解:

>>> [int(x) for x in lst]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

请注意,在 Python3 中,map将生成一个映射对象,如果您想要一个列表,则必须显式转换为列表。因此,Python3 中的理解方式可能是首选:

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