使用花哨的索引从 Numpy 数组中查找和删除全零列

Posted

技术标签:

【中文标题】使用花哨的索引从 Numpy 数组中查找和删除全零列【英文标题】:Find and delete all-zero columns from Numpy array using fancy indexing 【发布时间】:2019-01-17 02:13:34 【问题描述】:

如何在 numpy 数组中找到全为零的列,然后从数组中删除它们?我正在寻找一种方法来获取列索引,然后使用这些索引进行删除。

【问题讨论】:

【参考方案1】:

您可以使用np.argwherenp.all 来查找您的索引。要删除它们,请使用np.delete

示例

找到您的 0 列:

a = np.array([[1, 2, 0, 3, 0],
              [4, 5, 0, 6, 0],
              [7, 8, 0, 9, 0]])

idx = np.argwhere(np.all(a[..., :] == 0, axis=0))

>>> idx
array([[2],
       [4]])

删除您的列

a2 = np.delete(a, idx, axis=1)

>>> a2
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

【讨论】:

【参考方案2】:

这是我得到的解决方案

假设OriginMat 是原始数据的矩阵, Result 是我要放置结果的矩阵,然后

Result = OriginMat[:,~np.all(OriginMat == 0, axis = 0)]

打破它会是

检查列(轴 0)的值是否为 0 并否定这个值,所以零列被视为假

~np.all(OriginMat == 0, axis = 0)

生成的矩阵将是一个带有 False 的向量,其中所有元素 为 0,不为 True 时

最后一步只是选择 True 的列(因此不是 0)

感谢以下网站,我得到了这个解决方案:

https://www.science-emergence.com/Articles/How-to-remove-array-rows-that-contain-only-0-in-python/

【讨论】:

这很好用而且非常优雅,我认为这应该是公认的答案。【参考方案3】:
# Some random array of 1's and 0's
x = np.random.randint(0,2, size=(3, 100))
# Find where all values in the columns are zero
mask = (x == 0).all(0)
# Find the indices of these columns
column_indices = np.where(mask)[0]
# Update x to only include the columns where non-zero values occur.
x = x[:,~mask]

【讨论】:

以上是关于使用花哨的索引从 Numpy 数组中查找和删除全零列的主要内容,如果未能解决你的问题,请参考以下文章

更改不在索引列表中的 NumPy 数组的值

是否可以在 Numpy 矢量化广播操作期间访问当前索引?

如何使用numpy查找数组中元素的索引? [复制]

各种 numpy 花式索引方法的性能,也与 numba

如何在 numpy 数组上定义一个使用数组索引查找字典的函数?

在 NumPy 数组中查找等于零的元素的索引