如何删除 numpy.array 中的列

Posted

技术标签:

【中文标题】如何删除 numpy.array 中的列【英文标题】:How to delete columns in numpy.array 【发布时间】:2010-12-11 04:38:51 【问题描述】:

我想删除 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.]])

我该怎么做?

【问题讨论】:

【参考方案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 page,numpy.delete的参数如下:

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

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

【讨论】:

我相信你应该引用numpy,而不是scipy。 docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html 只是添加说明:数组、索引和轴作为参数【参考方案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]])

【讨论】:

@alvas 这是一个组织良好的解释! ***.com/questions/32682754/… @Alvas,s_ 是:A nicer way to build up index tuples for arrays.:docs.scipy.org/doc/numpy/reference/generated/numpy.s_.html【参考方案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.]]

【讨论】:

其实我没关注你。这段代码是如何工作的?

以上是关于如何删除 numpy.array 中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NumPy 数组中删除所有零元素?

如何删除多维 Laravel 集合中的列?

如何删除R数据框中的列[重复]

如何通过给定Linux中另一个文件中的列来从文件中删除列?

如何从熊猫数据框中的列中删除字符串值

如何使用特定表中的列作为我需要从中删除、插入或更新数据的表名