【问题标题】:The same operation for many pairs in PythonPython中许多对的相同操作
【发布时间】:2018-03-19 19:21:09
【问题描述】:

在 Python 中,我想评估一个数组的函数,但是,一个对数组(或更一般的数组)。

我知道我可以对一组标量执行此操作:

def f_test(scalar, pair):      
    return scalar + pair[0] + pair[1]

result = f_test(numpy.linspace(0, 9, 10), [3, 4])

并得到想要的结果:

[  7.   8.   9.  10.  11.  12.  13.  14.  15.  16.]

所以这对是固定的,标量是从数组中获取的。

问题是:可以换一种方式吗?在标量保持固定的情况下... 可以从向量中提取对以再次获得与结果长度相同的向量吗?

那是为了(例如,不一定是 numpy.array)

scalar = 0
pair = numpy.array([ [1,2], [3,7], [5,8] ])

获得

[ 3, 10, 13 ]

而不是

[4, 9]

注意:我已经大大简化了我需要对数字执行的操作,以保持示例简单。

如果无法完成或更笼统:在大量数组上执行相同操作的最佳做​​法是什么(在 Python 中!)?

注意:我正在搜索这个主题,甚至发现了一些类似的问题。但是,我不确定它们是否真的相同,更重要的是没有找到答案。由于在我看来这是一个普遍可取的操作,我提出了一个单独的问题。

【问题讨论】:

  • 尽管有名称,但您的函数不适用于 scalar。它将pair 的两个元素添加到数组中,即将两个标量添加到数组中。我怀疑您需要更多练习来添加不同形状的数组。关键是了解广播的工作原理。
  • 是的,您可以这样做,但是如果您的计算可以表示为线性代数,那么这将被表述为矩阵乘法问题,它会快得多。特别是您可以使用旧的 3D 图形技巧并添加一个 1 的虚拟行来处理术语 scalar * 1。所以让你的输入是一个 3 x m 矩阵,其中第三行是一个。你需要告诉我们更多关于你的实际计算是什么。

标签: python arrays numpy vectorization


【解决方案1】:

一个解决方案是transposepair:

f_test(scalar, pair.T)
#array([ 3, 10, 13])

或者您可以使用列表推导:

[f_test(scalar=scalar, pair=p) for p in pair]
#[3, 10, 13]

计时结果

看起来第一种方法要快得多。对于长度为 100,000 的数组,我的计算机上的速度提升约为 270 倍!

N = 100000
scalar = 0
pair = np.array([[np.random.randint(0,10), np.random.randint(0,10)] for i in range(N)])

# Using transpose
%%timeit
f_test(scalar, pair.T)
#1000 loops, best of 3: 229 µs per loop

# List comprehension
%%timeit
[f_test(scalar=scalar, pair=p) for p in pair]
#10 loops, best of 3: 62 ms per loop

【讨论】:

  • 多么简单:)也感谢您的时间比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多