在另一个更大的数组中插入3D数组值的最佳方法

时间:2015-10-08 02:02:33

标签: numpy numpy-broadcasting

必须有一些' pythonic'这样做的方法,但我不认为np.placenp.insertnp.put是我正在寻找的。我想将较大的3D数组A内的值替换为较小的3D数组B的值,从较大数组中的位置[i,j,k]开始。见图:

我想键入类似 A [i +,j +,k +] = B np.embed(B,A,(i,j,k))但当然这些都不对。

编辑:哦,有这个。因此,我应该修改问题,询问这是否是最佳方式(对于笔记本电脑上的500x500x50浮动阵列,最好的"最好"意味着最快):

s0, s1, s2 = B.shape
A[i:i+s0, j:j+s1, k:k+s2] = B

one 3D array inside another

1 个答案:

答案 0 :(得分:2)

您编辑的答案看起来很适合3D案例。

如果你想要"嵌入"您在原始帖子中提到的功能,对于任意数量维度的数组,以下内容应该有效:

def embed( small_array, big_array, big_index):
    """Overwrites values in big_array starting at big_index with those in small_array"""
    slices = [np.s_[i:i+j] for i,j in zip(big_index, small_array.shape)]
    big_array[slices]=small_array

值得注意的是,人们不希望如何嵌入""在big_array的维度大于small_array的情况下执行。例如,我可以想象有人想要从small_array成员的1:1映射到big_array的覆盖成员(相当于将额外的长度为1的维度添加到small_array以使其ndim达到big_array的那个),或者我可以想象有人想要small_array广播以填补big_array的剩余部分,以便"缺失" small_array的维度。无论如何,您可能希望避免在这些情况下调用函数,或者调整函数以确保它在这些情况下可以执行您想要的操作。