首页 > 解决方案 > 每隔一段时间将迷你数组插入更大的数组(不改变大小)

问题描述

我试图在不调整大小的情况下将迷你数组插入到更大的数组中,因此使用迷你数组更改更大数组的值。

有一个迷你数组,x x。有一个更大的数组,X X 每 Y 个元素,用迷你数组值替换下一个元素。一路走到最后。

我试图通过索引来做到这一点(代码可以在下面找到)。

mesh_array = np.zeros(shape=(100,100), dtype=np.uint8) 
mini_square = np.ones(shape=(2,2), dtype=np.uint8) 

flattened_array = np.ravel(mesh_array) 
flattened_minisquare = np.ravel(mini_square) 

flattened_array[1:-1:10] = flattened_minisquare

预期结果是每 10 个元素,它将用 flattened_minisquare 值替换以下元素。

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

我得到的错误信息:

"ValueError: could not broadcast input array from shape (4) into shape (1000)"

标签: pythonarraysnumpyinsert

解决方案


可能有更好的方法,但一种方法是按如下方式处理此问题:

import numpy as np

mesh_array = np.zeros(shape=(100,100), dtype=np.uint8) 
mini_square = np.ones(shape=(2,2), dtype=np.uint8) 

flattened_array = np.ravel(mesh_array) 
flattened_minisquare = np.ravel(mini_square)

现在,我们可以构造数组,该数组将对应于您希望minisquare将剩余值填充为零的位置。请注意,如果给定的输出是正确的,在这种情况下它将是一个长度为 13 的数组。原始数组的 9 个元素 + 来自 minisquare 的 4 个元素

stepsize = 10
temp = np.zeros(stepsize + len(flattened_minisquare) - 1)
temp[-len(flattened_minisquare):] = flattened_minisquare

我们还为没有被 minisquare 填充的值创建掩码。

mask = np.copy(temp)
mask[-len(flattened_minisquare):] = np.ones_like(flattened_minisquare)
mask = ~mask.astype(bool)

现在,只需使用np.resize扩展掩码和临时数组,然后最后使用掩码从旧数组中填充值。

out = np.resize(temp, len(flattened_array))
final_mask = np.resize(mask, len(flattened_array))
out[final_mask] = flattened_array[final_mask]

print(out)
#[0. 0. 0. ... 0. 0. 0.]

推荐阅读