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

uho*_*hoh 6 numpy array-broadcasting

必须有一些“Python化”的方式来做到这一点,但我不认为np.placenp.insert或者np.put是什么我要找的。我想A用较小的 3D 数组中的值替换大型 3D 数组中的值B,从[i,j,k]较大数组中的位置开始。看图:

我想输入类似A[i+, j+, k+] = Bnp.embed(B, A, (i,j,k)) 之类的内容,但当然这些都是不对的。

编辑:哦,有这个。所以我应该修改问题以询问这是否是最好的方法(其中“最佳”意味着笔记本电脑上 500x500x50 的浮点数组最快):

s0, s1, s2 = B.shape
A[i:i+s0, j:j+s1, k:k+s2] = B
Run Code Online (Sandbox Code Playgroud)

一个 3D 阵列在另一个里面

Jus*_*her 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
Run Code Online (Sandbox Code Playgroud)

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