加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读