在另一个更大的数组中插入 3D 数组值的最佳方法
Best way to insert values of 3D array inside of another larger array
一定有一些 'pythonic' 方法可以做到这一点,但我认为 np.place
、np.insert
或 np.put
不是我要找的.我想用较小的 3D 数组 B
中的值替换大型 3D 数组 A
中的值,从较大数组中的位置 [i,j,k]
开始。看图:
我想输入类似 A[i+, j+, k+] = B 或 np.embed(B, A, (i ,j,k)) 但这些当然是不对的。
编辑:哦,有这个。所以我应该修改问题以询问这是否是最好的方法(其中 "best" 意味着笔记本电脑上的 500x500x50 浮点数组最快):
s0, s1, s2 = B.shape
A[i:i+s0, j:j+s1, k:k+s2] = B
您编辑的答案在 3D 案例中看起来不错。
如果您想要您在原文 post 中提到的 "embed" 函数,对于任意维数的数组,以下应该有效:
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 具有更多维度的情况下,人们希望 "embed" 如何执行并不明显。例如,我可以想象有人想要从 small_array 成员到 big_array 的覆盖成员的 1:1 映射(相当于向 small_array 添加额外的 length-1 维度以提高其 ndim到 big_array 的那个),或者我可以想象有人想要 small_array 广播以填充 small_array 的 "missing" 维度的 big_array 的剩余部分。无论如何,您可能希望避免在这些情况下调用该函数,或者调整该函数以确保它在这些情况下执行您想要的操作。
一定有一些 'pythonic' 方法可以做到这一点,但我认为 np.place
、np.insert
或 np.put
不是我要找的.我想用较小的 3D 数组 B
中的值替换大型 3D 数组 A
中的值,从较大数组中的位置 [i,j,k]
开始。看图:
我想输入类似 A[i+, j+, k+] = B 或 np.embed(B, A, (i ,j,k)) 但这些当然是不对的。
编辑:哦,有这个。所以我应该修改问题以询问这是否是最好的方法(其中 "best" 意味着笔记本电脑上的 500x500x50 浮点数组最快):
s0, s1, s2 = B.shape
A[i:i+s0, j:j+s1, k:k+s2] = B
您编辑的答案在 3D 案例中看起来不错。
如果您想要您在原文 post 中提到的 "embed" 函数,对于任意维数的数组,以下应该有效:
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 具有更多维度的情况下,人们希望 "embed" 如何执行并不明显。例如,我可以想象有人想要从 small_array 成员到 big_array 的覆盖成员的 1:1 映射(相当于向 small_array 添加额外的 length-1 维度以提高其 ndim到 big_array 的那个),或者我可以想象有人想要 small_array 广播以填充 small_array 的 "missing" 维度的 big_array 的剩余部分。无论如何,您可能希望避免在这些情况下调用该函数,或者调整该函数以确保它在这些情况下执行您想要的操作。