numpy 如何在不减少维度的情况下从3D数组中删除全零列

w7t8yxp5  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(95)

我尝试使用numpy从3D数组中删除全零列,同时保持维数。我也不想使用trim,因为列可能不在数组的边缘。
Intended functionality
我尝试使用~np.all,但这似乎去掉了一个维度:

import numpy as np

vals = [1,0,3,4,0,6,7,8,9,10,11,12]
array = np.reshape(vals, (2,2,3))

数组:

[[[ 1  0  3]
  [ 4  0  6]]

 [[ 7  8  9]
  [10 11 12]]]

这就是我想看到的:

[[[ 1  3]
  [ 4  6]]

 [[ 7  9]
  [10 12]]]
vaj7vani

vaj7vani1#

让我们把它分成多个步骤。
1.使用astype方法将数组转换为布尔值。所有False的列都是0。
1.对数组使用NOT将0列从False转换为True
1.在轴1上使用all执行逻辑AND,检查列是否全为0。
1.在轴0上使用any执行逻辑OR,该操作将结果折叠以获得数组中每列的TrueFalse值。
1.使用NOT版本的结果来索引数组的最后一个轴,以仅获取不包含0的列。
带标签的步骤:

import numpy as np

vals = [1, 0, 3, 4, 0, 6, 7, 8, 9, 10, 11, 12]
array = np.reshape(vals, (2, 2, 3))
step1 = array.astype(bool)
step2 = ~step1
step3 = step2.all(1)
step4 = step3.any(0)
step5 = array[..., ~step4]

一起来:

vals = [1, 0, 3, 4, 0, 6, 7, 8, 9, 10, 11, 12]
array = np.reshape(vals, (2, 2, 3))
res = array[..., ~(~array.astype(bool)).all(1).any(0)]
print(res)

输出:

[[[ 1  3]
  [ 4  6]]

 [[ 7  9]
  [10 12]]]

相关问题