我有一个小的NXN数组“块”,我想插入到一个大数组“墙”的指定区域(即“开始”处的对角线区域)。有没有有效的方法来实现这一点?
wall[start:start+N][start:start+N] = block[:][:]
字符串我现在做的就是:
for i in xrange(N): wall[start+i][start:start+N] = block[i][:]
型
iugsix8n1#
你可以使用多维索引:
import numpy as np wall = np.zeros((10,10),dtype=np.int) block = np.arange(1,7).reshape(2,3) x = 2 y = 3 wall[x:x+block.shape[0], y:y+block.shape[1]] = block
字符串输出为:
>>> wall array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 2, 3, 0, 0, 0, 0], [0, 0, 0, 4, 5, 6, 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, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
blpfk2vs2#
这里有一个解决方案,即使给定的位置偏离wall numpy数组的边缘,也可以工作,并且适用于wall和block的任何维数(注意:提供的位置loc需要是一个元组,即使在1D情况下)。
wall
block
loc
def paste_slices(tup): pos, w, max_w = tup wall_min = max(pos, 0) wall_max = min(pos+w, max_w) block_min = -min(pos, 0) block_max = max_w-max(pos+w, max_w) block_max = block_max if block_max != 0 else None return slice(wall_min, wall_max), slice(block_min, block_max) def paste(wall, block, loc): loc_zip = zip(loc, block.shape, wall.shape) wall_slices, block_slices = zip(*map(paste_slices, loc_zip)) wall[wall_slices] = block[block_slices]
字符串测试:
1D
>>> b = np.zeros([10]) >>> a = np.arange(1, 5) >>> b array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> a array([1, 2, 3, 4]) >>> paste(b, a, (8,)) >>> b array([ 0., 0., 0., 0., 0., 0., 0., 0., 1., 2.])
二维
>>> b = np.zeros([10, 10]) >>> a = np.arange(1,33).reshape(4,8) >>> b 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.], [ 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., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) >>> a array([[ 1, 2, 3, 4, 5, 6, 7, 8], [ 9, 10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31, 32]]) >>> paste(b, a, (-1, -3)) >>> b array([[ 12., 13., 14., 15., 16., 0., 0., 0., 0., 0.], [ 20., 21., 22., 23., 24., 0., 0., 0., 0., 0.], [ 28., 29., 30., 31., 32., 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., 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.]])
2条答案
按热度按时间iugsix8n1#
你可以使用多维索引:
字符串
输出为:
型
blpfk2vs2#
这里有一个解决方案,即使给定的位置偏离
wall
numpy数组的边缘,也可以工作,并且适用于wall
和block
的任何维数(注意:提供的位置loc
需要是一个元组,即使在1D情况下)。字符串
测试:
1D
型
二维
型