gpt4 book ai didi

python - 从 numpy 中的 3d 数组中删除 2d 子数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:06 25 4
gpt4 key购买 nike

在 numpy 中,我有一个 3d 数组,我想删除一些 2d 子数组。可以这样想:

r = range(27)
arr = np.reshape(r, (3,3,3))

del = [[0,1,2],[0,0,2]]
flatSeam = np.ravel_multi_index(del, arr.shape)
arr = np.delete(arr, flatSeam)

所以最后我想要一个形状为 (3,2,3) 的数组,但不包含原始数组中的元素 00, 10, 22 .我的问题是我没有为此使用 ravel_multi_index,因为我的索引是 2d 而数组形状是 3d,所以计算了错误的索引(上面的代码也没有执行,因为索引数组和形状必须大小相同)。

您有什么想法可以实现吗?

最佳答案

这是一种使用 advanced-indexing 的方法-

# arr: Input array, rm_idx : 2-row list/array of indices to be removed
m,n,p = arr.shape
mask = np.asarray(rm_idx[1])[:,None] != np.arange(n)
out = arr[np.arange(m)[:,None],np.where(mask)[1].reshape(m,-1)]

或者,使用 boolean-indexing -

out = arr.reshape(-1,p)[mask.ravel()].reshape(m,-1,p)

我们尽量避免创建 2D mask -

vmask = ~np.in1d(np.arange(m*n),rm_idx[1] + n*np.arange(m))
out = arr.reshape(-1,p)[vmask].reshape(m,-1,p)

关于python - 从 numpy 中的 3d 数组中删除 2d 子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com