Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在进行向量运算时在Numpy中组合数组的不同元素_Python_Arrays_Numpy - Fatal编程技术网

Python 在进行向量运算时在Numpy中组合数组的不同元素

Python 在进行向量运算时在Numpy中组合数组的不同元素,python,arrays,numpy,Python,Arrays,Numpy,我有一个函数f,我正在使用它反复演化一个Numpy数组z。因此,我的代码如下所示: for t in range(100): z = f(z) N = len(z) for t in range(100): for i in range(len(z)): z_new[i] = f(z[i]) + z[(i-1)%N] + z[(i+1)%N] z = z_new 然而,现在我想在进化的同时结合数组的元素。例如,在简单Python中,我想做如下操作:

我有一个函数
f
,我正在使用它反复演化一个Numpy数组
z
。因此,我的代码如下所示:

for t in range(100):
    z = f(z)
N = len(z)
for t in range(100):
    for i in range(len(z)):
         z_new[i] = f(z[i]) + z[(i-1)%N] + z[(i+1)%N]
    z = z_new
然而,现在我想在进化的同时结合数组的元素。例如,在简单Python中,我想做如下操作:

for t in range(100):
    z = f(z)
N = len(z)
for t in range(100):
    for i in range(len(z)):
         z_new[i] = f(z[i]) + z[(i-1)%N] + z[(i+1)%N]
    z = z_new
如何在Numpy向量运算中实现同样的效果,这样我就不必妥协于Numpy给我的巨大速度

提前感谢

您可以来回滚动数据以获得相同的结果

Z = f(z)
Z = np.roll(Z, 1) + z
Z = np.roll(Z, -2) + z
z = np.roll(Z, 1)

我最初也考虑过切片,但当我找到它时,我选择了
np.roll

根据@hpaulj的评论,我提出了一个切片解决方案:

q = np.array([1,2,3,4,5])
Q = f(q)
# operate on the middle
Q[1:] += q[:-1]
Q[:-1] += q[1:]
# operate on the ends
Q[0] += q[-1]
Q[-1] += q[0]

q = Q.copy()

i
是最后一个元素的索引时,
z[i+1]
是什么?我实际使用的是模。因此,实际条目是
z[(i-1)%N]
z[(i+1)%N]
,因此
z[i+1]=z[0]
i
是最后一个元素时。另外,这里的
N=len(z)
。切片是索引数组的最快方法,例如
z[1:]-z[:-1]
。如果您必须绕行,您将不得不使用较慢的高级索引或连接。查看
roll
的内部结构。再看看
take
put
。将包装要求添加到迭代示例中。实际上,我真正的任务要复杂得多,但我认为这个出色的滚动函数应该可以完成这项工作。谢谢