Pythonnumpy棘手的切片问题

Pythonnumpy棘手的切片问题,第1张

概述我有一些问题与一些numpy东西.我需要一个numpy数组以一种不寻常的方式表现,方法是返回一个切片作为我切片的数据的视图,而不是副本.所以这是我想要做的一个例子: 假设我们有一个这样的简单数组: a = array([1, 0, 0, 0]) 我想用数组中的上一个条目更新数组中的连续条目(从左向右移动),使用如下语法: a[1:] = a[0:3] 这将得到以下结果: a = array([1, 我有一些问题与一些numpy东西.我需要一个numpy数组以一种不寻常的方式表现,方法是返回一个切片作为我切片的数据的视图,而不是副本.所以这是我想要做的一个例子:

假设我们有一个这样的简单数组:

a = array([1,0])

我想用数组中的上一个条目更新数组中的连续条目(从左向右移动),使用如下语法:

a[1:] = a[0:3]

这将得到以下结果:

a = array([1,1,1])

或类似的东西:

a[1:] = 2*a[:3]# a = [1,2,4,8]

为了进一步说明,我想要以下类型的行为:

for i in range(len(a)):    if i == 0 or i+1 == len(a): continue    a[i+1] = a[i]

除了我想要numpy的速度.

numpy的默认行为是获取切片的副本,所以我实际得到的是:

a = array([1,0])

我已将此数组作为ndarray的子​​类,因此如果需要,我可以对其进行进一步更改,我只需要右侧的切片不断更新,因为它会更新左侧的切片.

我梦想还是这种魔法可能?

更新:这都是因为我试图使用Gauss-SeIDel迭代来解决线性代数问题,或多或少.这是一个涉及谐波函数的特殊情况,我试图避免进入这个,因为它真的没有必要,可能会进一步混淆事情,但这里有.

算法是这样的:

while not converged:    for i in range(len(u[:,0])):        for j in range(len(u[0,:])):            # skip over boundary entrIEs,i,j == 0 or len(u)            u[i,j] = 0.25*(u[i-1,j] + u[i+1,j] + u[i,j-1] + u[i,j+1])

对?但是你可以用两种方式做到这一点,Jacobi涉及用它的邻居更新每个元素而不考虑你在while循环循环之前已经进行的更新,在循环中你要复制数组然后从复制的数组中更新一个数组.然而,Gauss-SeIDel使用您已经为每个i-1和j-1条目更新的信息,因此不需要复制,循环应该基本上“知道”,因为在每个单元素更新后重新评估了数组.也就是说,每当我们调用像u [i-1,j]或u [i,j-1]这样的条目时,前一循环中计算的信息就会存在.

我想使用numpy切片用一个很好的简洁代码行替换这个缓慢而丑陋的嵌套循环情况:

u[1:-1,1:-1] = 0.25(u[:-2,1:-1] + u[2:,1:-1] + u[1:-1,:-2] + u[1:-1,2:])

但结果是Jacobi迭代,因为当你采用切片:u [:,– 2,1:-1]时,你复制了数据,因此切片不知道所做的任何更新.现在numpy还在循环吗?它不是平行的,它只是一种更快的循环方式,看起来像是python中的并行 *** 作.我想利用这种行为通过一种黑客numpy来当我切片时返回一个指针而不是一个副本.对?然后,每次numpy循环,该片段将“更新”或真正只是复制更新中发生的任何事情.要做到这一点,我需要在数组的两侧切片作为指针.

无论如何,如果有一些非常聪明的人在那里真棒,但我几乎已经让自己相信唯一的答案是循环使用C.

解决方法 迟到的答案,但这出现在Google上,所以我可能会指出OP想要的文档.您的问题很明显:使用NumPy切片时,会创建临时图.通过快速调用weave.blitz来包装您的代码,以摆脱临时性并获得您想要的行为.

阅读PerformancePython tutorial的weave.blitz部分了解完整详情.

总结

以上是内存溢出为你收集整理的Python / numpy棘手的切片问题全部内容,希望文章能够帮你解决Python / numpy棘手的切片问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存