python – 通过引用组合NumPy数组
发布时间:2020-12-20 13:32:27 所属栏目:Python 来源:网络整理
导读:我想在O(1)中将两个数组组合成一个新数组.然后,我想更改此新数组中的值以更改旧数组中的值. 这是在PyGame的surfarray模块的上下文中,该模块没有返回RGBA(n * m * 4)数组的函数 – 仅分别为RGB(n * m * 3)和A(n * m)数组.理想情况下,我会在O(1)中创建一个新的
我想在O(1)中将两个数组组合成一个新数组.然后,我想更改此新数组中的值以更改旧数组中的值.
这是在PyGame的surfarray模块的上下文中,该模块没有返回RGBA(n * m * 4)数组的函数 – 仅分别为RGB(n * m * 3)和A(n * m)数组.理想情况下,我会在O(1)中创建一个新的数组“RGBA”,它引用“RGB”和“A”数组.改变“RGBA”会改变“RGB”和“A”,因此改变表面. 我不知道这是否可行,因为我想不出用C做的方法.但是,我可以想到一些想法.例如,可能有一个numpy数组类型封装了一些子数组,并在内部将索引重定向到C级的正确数据.这没关系. 解决方法
您可以创建自己的类来管理引用过程,如下例所示.你应该进一步研究这个问题,包括使用__getslice __,__ add__,__ mul__等切片功能.
import numpy as np a1 = np.arange(1,11) a2 = np.arange(101,111) class Combiner(): def __init__(self,*args): self.arrays = [arg for arg in args] self.lens = [len(arg) for arg in args] def __getitem__(self,i): if i >=0: shift = 0 acc = 0 for j,l in enumerate(self.lens): acc += l if i<acc: return self.arrays[j][i-shift] shift += l if i<0: shift = 0 acc = 0 for j in xrange(len(self.lens)-1,-1,-1): l = self.lens[j] acc -= l if i>=acc: return self.arrays[j][i+shift] shift += l def __setitem__(self,i,v): if i >=0: shift = 0 acc = 0. for j,l in enumerate(self.lens): acc += l if i<acc: self.arrays[j][i-shift] = v return shift += l if i<0: shift = 0 acc = 0 for j in xrange(len(self.lens)-1,-1): l = self.lens[j] acc -= l if i>=acc: self.arrays[j][i+shift] = v return shift += l a3 = Combiner(a1,a2) print a3[-10] # 101 a3[-2] = 22222 a3[ 4] = 22222 print a1 #[ 1 2 3 4 22222 6 7 8 9 10] print a2 #[ 101 102 103 104 105 106 107 108 22222 110] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |