2015-02-23 39 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

相關問題