gpt4 book ai didi

python - 如何用python写numpy : b = sum(v) - a as an implicitly elementwise (vector) computation?

转载 作者:行者123 更新时间:2023-11-28 17:50:03 24 4
gpt4 key购买 nike

我将从问题的陈述开始。之后,我将演示一个简短的编码序列,逐步构建解决方案,直到出现问题。显然,这里的目标是计算 b。我在问如何最有效地做到这一点,理想情况下使用元素级 numpy 向量表达式,完全没有迭代也没有循环:

b = sum(v)-a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py", line 1251, in sum
return _wrapit(a, 'sum', axis, dtype, out)
File "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py", line 37, in _wrapit
result = getattr(asarray(obj),method)(*args, **kwds)
File "/usr/lib64/python2.6/site-packages/numpy/core/numeric.py", line 230, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

这是我尝试执行的导致该错误的代码的最佳版本。为了清楚起见,我添加了一些打印语句:

a = array([0,1,0,1,1])
b = +a
print b
array([0, 1, 0, 1, 1])

b = array([sum(a[0:2]), sum(a[0:3]), sum(a[1:4]), sum(a[2:5]), sum(a[3:5])])
print b
array([1, 1, 2, 2, 2])

b = array([sum(a[0:2])-a[0], sum(a[0:3])-a[1], sum(a[1:4])-a[2], sum(a[2:5])-a[3], sum(a[3:5])-a[4]])
print b
array([1, 0, 2, 1, 1])

v = [a[0:2], a[0:3], a[1:4], a[2:5], a[3:5]]
print v
[array([0, 1]), array([0, 1, 0]), array([1, 0, 1]), array([0, 1, 1]), array([1, 1])]

注意 v 是一个 View 列表。 View 指的是支持数组 a。

print a
array([0, 1, 0, 1, 1])

a[0]=9
print v
[array([9, 1]), array([9, 1, 0]), array([1, 0, 1]), array([0, 1, 1]), array([1, 1])]

a[0]=0
print v
[array([0, 1]), array([0, 1, 0]), array([1, 0, 1]), array([0, 1, 1]), array([1, 1])]

到目前为止一切顺利:变量 v 是一个真实 View ,这意味着 v 在 a 更新时更新。

b = array([sum(v[0])-a[0], sum(v[1])-a[1], sum(v[2])-a[2], sum(v[3])-a[3], sum(v[4])-a[4]])
print b
array([1, 0, 2, 1, 1])

非常好,到目前为止一切顺利。现在让我们进一步简化代码行……请注意变量 b、v 和 a 都具有相同数量的元素。

b = sum(v)-a
Traceback (most recent call last)...(error messages)...

哦,糟糕的代码!现在,我也尝试了其他方式来表达 b,但它们都是类似的错误,我没有必要在这里展示更多糟糕的代码。问题是如何正确且最有效地表达赋值表达式。如果在这个特定的应用程序中可能的话,特别有助于计算,将在设置 View 后完全避免循环表达式并避免列表理解。

在此应用程序中使用慢循环设置 View 是可以的。观点不会经常改变。支持数组 a 会经常变化,并且会非常大。

感谢您的阅读以及您提出的任何最佳建议!

最佳答案

对于您发布的特定 View v,计算可以表示为 convolution与内核 [1, 1, 1]:

In [78]: import numpy as np    

In [80]: a = np.array([0,1,0,1,1])

In [81]: b = np.convolve(a, [1,1,1], 'same') - a

In [82]: b
Out[82]: array([1, 0, 2, 1, 1])

您没有说明您的 v 如何随时间变化,但也许如果它们相似,您可以继续将计算表示为随内核变化的卷积。

关于python - 如何用python写numpy : b = sum(v) - a as an implicitly elementwise (vector) computation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11956458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com