当前位置: 首页 > 知识库问答 >
问题:

如何删除二维矩阵中具有0值的前n列/行?

仰翰采
2023-03-14

关于上一个问题:

删除2D矩阵中的全零行

import numpy as np

data = np.array([[4, 1, 1, 2, 0, 4],
                 [3, 4, 3, 1, 4, 4],
                 [1, 4, 3, 1, 0, 0],
                 [0, 4, 4, 0, 4, 3],
                 [0, 0, 0, 0, 0, 0]])

data = data[~(data==0).all(1)]
print(data)

输出:

    [[4 1 1 2 0 4]
     [3 4 3 1 4 4]
     [1 4 3 1 0 0]
     [0 4 4 0 4 3]]

好的,到目前为止还不错,但是如果我添加空列呢?

 data = np.array([[0, 4, 1, 1, 2, 0, 4],
                  [0, 3, 4, 3, 1, 4, 4],
                  [0, 0, 1, 4, 3, 1, 0],
                  [0, 0, 4, 4, 0, 4, 3],
                  [0, 0, 0, 0, 0, 0, 0]])

输出为

          [[0 4 1 1 2 0 4]
           [0 3 4 3 1 4 4]
           [0 1 4 3 1 0 0]
           [0 0 4 4 0 4 3]]

这不是我想要的。

基本上如果我的矩阵是:

            [[0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 4, 1, 1, 2, 0, 4, 0],
             [0, 0, 3, 4, 3, 1, 4, 4, 0],
             [0, 0, 1, 4, 3, 1, 0, 0, 0],
             [0, 0, 0, 4, 4, 0, 4, 3, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0]]

我期待的输出是

        [[4 1 1 2 0 4]
         [3 4 3 1 4 4]
         [1 4 3 1 0 0]
         [0 4 4 0 4 3]]

共有2个答案

鲁英卫
2023-03-14

您可以使用scipy。ndimage。测量。查找对象

import numpy as np
from scipy.ndimage.measurements import find_objects

data = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
                 [0, 0, 4, 1, 1, 2, 0, 4, 0],
                 [0, 0, 3, 4, 3, 1, 4, 4, 0],
                 [0, 0, 1, 4, 3, 1, 0, 0, 0],
                 [0, 0, 0, 4, 4, 0, 4, 3, 0],
                 [0, 0, 0, 0, 0, 0, 0, 0, 0]])
data[find_objects(data.astype(bool))[0]]
#array([[4, 1, 1, 2, 0, 4],
#       [3, 4, 3, 1, 4, 4],
#       [1, 4, 3, 1, 0, 0],
#       [0, 4, 4, 0, 4, 3]])
闾丘卓
2023-03-14

这里有一个方法-

def reduced_box(a):
    # Store shape info
    M,N = a.shape

    # Mask of valid places in the array
    mask = a!=0

    # Get boolean array with at least a valid one per row
    m_col = mask.any(1)

    # Get the starting and ending valid rows with argmax.
    # More info : https://stackoverflow.com/a/47269413/
    r0,r1 = m_col.argmax(), M-m_col[::-1].argmax()

    # Repeat for cols
    m_row = mask.any(0)
    c0,c1 = m_row.argmax(), N-m_row[::-1].argmax()

    # Finally slice with the valid indices as the bounding box limits
    return a[r0:r1,c0:c1]

样品运行-

In [210]: a
Out[210]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 4, 1, 0, 2, 0, 4, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 4, 0, 1, 0, 0, 0],
       [0, 0, 0, 4, 0, 0, 4, 3, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

In [211]: reduced_box(a)
Out[211]: 
array([[4, 1, 0, 2, 0, 4],
       [0, 0, 0, 0, 0, 0],
       [1, 4, 0, 1, 0, 0],
       [0, 4, 0, 0, 4, 3]])
 类似资料:
  • 问题内容: 我有N维向量数组。 我正在使用sklearn的函数来计算距离值矩阵。注意,该矩阵关于对角线对称。 我需要与该矩阵中前N个值相对应的索引,因为这些索引将与成对索引相对应,它们代表了向量之间的最大距离。 我尝试做以获得每一行中最大值的索引,并获取每一列中最大值的索引,但是请注意: 和: 因为矩阵是关于对角线对称的,并且因为argmax返回它找到的具有最大值的第一个索引,所以我最终在行和列匹

  • 问题内容: 我试图创建此代码以输入m x n矩阵。我打算输入,但是代码产生了。当我输入其他m×n矩阵时,也会发生相同的情况,代码会产生行数相同的m×n矩阵。 也许您可以帮助我找到我的代码有什么问题。 问题答案: 问题出在初始化步骤上。 这段代码实际上使您的每一行都引用相同的对象。如果任何列中的任何项目发生更改-其他所有列都将发生变化: 您可以在嵌套循环中初始化矩阵,如下所示: 或者,通过使用列表理

  • 我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512) 我想在数组周围循环/滑动,这样我就可以在表单中保存新数组 < code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口

  • 我有一个矩阵就像 现在我想删除每列的3个最大值,这样我就有了一个包含7行的新矩阵 我尝试为每列创建向量,然后用 然后把向量放到一个新的矩阵中,但由于我的矩阵有时有很多列,我想找到一种更简单的方法<谢谢你的帮助

  • 我正在解决一个程序设计的挑战,在一个2D NxN矩阵中寻找最长的递增子序列的长度。在序列的每个元素中,行和列都必须增加(不需要连续)。本文用动态规划方法求解,但它是O(n^4),效率低。然而,在O(n^3)中有许多解。一种这样的解决办法是: 有人能解释一下它的工作原理或其他O(n^3)方法吗?我根本听不懂:(。

  • 本文向大家介绍如何在R中创建具有随机值的矩阵?,包括了如何在R中创建具有随机值的矩阵?的使用技巧和注意事项,需要的朋友参考一下 通常,使用给定值创建矩阵,但是如果我们要创建具有随机值的矩阵,则将对矩阵函数使用常规方法。R中的随机选择可以根据我们的目标以多种方式完成,例如,如果要从正态分布中随机选择值,则将使用rnorm函数并将其存储在矩阵中,然后将其传递到矩阵函数中。 示例 输出结果 示例 输出结