【问题标题】:How to delete columns in numpy.array如何删除 numpy.array 中的列
【发布时间】:2023-03-08 18:56:01
【问题描述】:

我想删除 numpy.array 中的选定列。我就是这样做的:

n [397]: a = array([[ NaN,   2.,   3., NaN],
   .....:        [  1.,   2.,   3., 9]])

In [398]: print a
[[ NaN   2.   3.  NaN]
 [  1.   2.   3.   9.]]

In [399]: z = any(isnan(a), axis=0)

In [400]: print z
[ True False False  True]

In [401]: delete(a, z, axis = 1)
Out[401]:
 array([[  3.,  NaN],
       [  3.,   9.]])

在此示例中,我的目标是删除所有包含 NaN 的列。我期待最后一个命令 结果:

array([[2., 3.],
       [2., 3.]])

我该怎么做?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    这会创建另一个没有这些列的数组:

      b = a.compress(logical_not(z), axis=1)
    

    【讨论】:

    • 酷。我希望 matlab 的语法在这里工作:“a(:,z) = []” 要简单得多
    • @bpowah:确实。更一般的方法是 b = a[:,z]。您可能需要相应地更新您的答案
    【解决方案2】:

    另一种方法是使用掩码数组:

    import numpy as np
    a = np.array([[ np.nan,   2.,   3., np.nan], [  1.,   2.,   3., 9]])
    print(a)
    # [[ NaN   2.   3.  NaN]
    #  [  1.   2.   3.   9.]]
    

    np.ma.masked_invalid 方法返回一个屏蔽了 nans 和 infs 的屏蔽数组:

    print(np.ma.masked_invalid(a))
    [[-- 2.0 3.0 --]
     [1.0 2.0 3.0 9.0]]
    

    np.ma.compress_cols 方法返回一个二维数组,其中任何列都包含 屏蔽值被抑制:

    a=np.ma.compress_cols(np.ma.masked_invalid(a))
    print(a)
    # [[ 2.  3.]
    #  [ 2.  3.]]
    

    manipulating-a-maskedarray

    【讨论】:

      【解决方案3】:

      鉴于它的名字,我认为标准的方式应该是delete

      import numpy as np
      
      A = np.delete(A, 1, 0)  # delete second row of A
      B = np.delete(B, 2, 0)  # delete third row of B
      C = np.delete(C, 1, 1)  # delete second column of C
      

      根据numpy's documentation pagenumpy.delete的参数如下:

      numpy.delete(arr, obj, axis=None)

      • arr 指的是输入数组,
      • obj 指的是哪些子数组(例如列/行号或数组的切片)和
      • axis 指的是按列 (axis = 1) 或按行 (axis = 0) 的删除操作。

      【讨论】:

      【解决方案4】:

      来自the numpy documentation的示例:

      >>> a = numpy.array([[ 0,  1,  2,  3],
                     [ 4,  5,  6,  7],
                     [ 8,  9, 10, 11],
                     [12, 13, 14, 15]])
      
      >>> numpy.delete(a, numpy.s_[1:3], axis=0)                       # remove rows 1 and 2
      
      array([[ 0,  1,  2,  3],
             [12, 13, 14, 15]])
      
      >>> numpy.delete(a, numpy.s_[1:3], axis=1)                       # remove columns 1 and 2
      
      array([[ 0,  3],
             [ 4,  7],
             [ 8, 11],
             [12, 15]])
      

      【讨论】:

      【解决方案5】:

      根据您的情况,您可以使用以下方法提取所需的数据:

      a[:, -z]
      

      “-z”是布尔数组“z”的逻辑否定。这与以下内容相同:

      a[:, logical_not(z)]
      

      【讨论】:

        【解决方案6】:

        来自Numpy Documentation

        np.delete(arr, obj, axis=None) 返回一个新数组,其中删除了沿轴的子数组。

        >>> arr
        array([[ 1,  2,  3,  4],
               [ 5,  6,  7,  8],
               [ 9, 10, 11, 12]])
        >>> np.delete(arr, 1, 0)
        array([[ 1,  2,  3,  4],
               [ 9, 10, 11, 12]])
        
        >>> np.delete(arr, np.s_[::2], 1)
        array([[ 2,  4],
               [ 6,  8],
               [10, 12]])
        >>> np.delete(arr, [1,3,5], None)
        array([ 1,  3,  5,  7,  8,  9, 10, 11, 12])
        

        【讨论】:

          【解决方案7】:
          >>> A = array([[ 1,  2,  3,  4],
                         [ 5,  6,  7,  8],
                         [ 9, 10, 11, 12]])
          
          >>> A = A.transpose()
          
          >>> A = A[1:].transpose()
          

          【讨论】:

            【解决方案8】:

            删除包含 NaN 的 Matrix 列。 这是一个冗长的答案,但希望很容易理解。

            def column_to_vector(matrix, i):
                return [row[i] for row in matrix]
            import numpy
            def remove_NaN_columns(matrix):
                import scipy
                import math
                from numpy import column_stack, vstack
            
                columns = A.shape[1]
                #print("columns", columns)
                result = []
                skip_column = True
                for column in range(0, columns):
                    vector = column_to_vector(A, column)
                    skip_column = False
                    for value in vector:
                        # print(column, vector, value, math.isnan(value) )
                        if math.isnan(value):
                            skip_column = True
                    if skip_column == False:
                        result.append(vector)
                return column_stack(result)
            
            ### test it
            A = vstack(([ float('NaN'), 2., 3., float('NaN')], [ 1., 2., 3., 9]))
            print("A shape", A.shape, "\n", A)
            B = remove_NaN_columns(A)
            print("B shape", B.shape, "\n", B)
            
            A shape (2, 4) 
             [[ nan   2.   3.  nan]
             [  1.   2.   3.   9.]]
            B shape (2, 2) 
             [[ 2.  3.]
             [ 2.  3.]]
            

            【讨论】:

            • 其实我没关注你。这段代码是如何工作的?
            猜你喜欢
            • 2019-05-20
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 2021-12-26
            • 2021-08-13
            • 2023-01-16
            • 2020-05-19
            • 2014-05-26
            相关资源
            最近更新 更多