2015-02-23 35 views
2

我想将一个数组复制到另一个具有不同大小的数组。 我想是这样的函数:numpy blit(将数组的一部分复制到另一个不同大小的数组)

blit(destimg,src,dstlocation) 

例如blit(zeros((7,7)),ones((3,3)),(4,4))

将导致

array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 1., 1., 1.]]) 

阵列src的左上中央现在处于的位置处的阵列destimg(4,4)

如果我没有blit(zeros((7,7)),ones((3,3)),(5,5))我会得到:

array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 1.], 
     [ 0., 0., 0., 0., 0., 1., 1.]]) 

数组src不适合在destimg,但其左上角仍然在正确的位置。

+1

你不能达到你想要的东西用一个简单的任务(即'='操作)并使用适当的索引? – 2015-02-23 14:39:05

+0

@ Jan-PhilipGehrcke我可以,但对于src数组不适合的情况下,我将不得不做一些计算,找出适当的索引。我想知道numpy是否已经有了这个功能。 – 2015-02-23 14:41:18

+0

为什么你的'''blit''函数不够? – wwii 2015-02-23 14:56:20

回答

3

你可以只计算相应的切片:

import numpy as np 

def blit(dest, src, loc): 
    pos = [i if i >= 0 else None for i in loc] 
    neg = [-i if i < 0 else None for i in loc] 
    target = dest[[slice(i,None) for i in pos]] 
    src = src[[slice(i, j) for i,j in zip(neg, target.shape)]] 
    target[[slice(None, i) for i in src.shape]] = src 
    return dest 

print(blit(np.zeros((7,7)), np.ones((3,3)), (5, 5))) 

产量

[[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 1. 1.] 
[ 0. 0. 0. 0. 0. 1. 1.]] 

print(blit(np.zeros((7,7)), np.ones((3,3)), (-1, -1))) 

产量

[[ 1. 1. 0. 0. 0. 0. 0.] 
[ 1. 1. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.]] 
0

我能找到一个解决方案(有点详细),必须有一个更优雅的方式,但在这段时间内会做。

from numpy import * 

def blit(dest, src, loc): 
    th,tw=dest.shape 
    sh,sw=src.shape 
    sr = 0 if -loc[0]<0 else -loc[0] 
    fr = sh if loc[0]+sh<=th else sh-(loc[0]+sh-th) 
    sc = 0 if -loc[1]<0 else -loc[1] 
    fc = sw if loc[1]+sw<=tw else sw-(loc[1]+sw-th) 
    loc[0] = max(0,loc[0]) 
    loc[1] = max(0,loc[1]) 
    dest[loc[0]:loc[0]+sh-sr,loc[1]:loc[1]+sw-sc] = src[sr:fr,sc:fc] 

dest = zeros((7,7)) 
src = ones((3,3)) 
loc = [5,5] 
blit(dest, src, loc) 
print dest 

产量:

[[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 1. 1.] 
[ 0. 0. 0. 0. 0. 1. 1.]] 

dest = zeros((7,7)) 
src = ones((3,3)) 
loc = [-1,-1] 
blit(dest, src, loc) 
print dest 

产生

[[ 1. 1. 0. 0. 0. 0. 0.] 
[ 1. 1. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0.]] 
+0

如你所见,更好的方法是@unutbu提出的。您肯定应该利用这样一个事实,即numpy数组上的切片索引的行为就像Python在内置类型上切片一样,相对于越界索引。从Python入门到字符串的引用:“退化的切片索引被正常处理:太大的索引被字符串大小替换,小于下限的上限返回空字符串。” – 2015-02-23 15:49:28

相关问题