如何删除numpy.array中的列

Bor*_*lik 62 python numpy scipy

我想删除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.]])
Run Code Online (Sandbox Code Playgroud)

在此示例中,我的目标是删除包含NaN的所有列.我希望最后一个命令导致:

array([[2., 3.],
       [2., 3.]])
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Ste*_*joa 80

鉴于其名称,我认为标准方式应该是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
Run Code Online (Sandbox Code Playgroud)

  • 我相信你应该引用"numpy",而不是"scipy".http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html (13认同)
  • 只需添加说明:数组,索引和轴作为参数 (4认同)

Nik*_*ick 19

numpy文档中的示例:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 13

另一种方法是使用蒙版数组:

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.]]
Run Code Online (Sandbox Code Playgroud)

np.ma.masked_invalid方法返回一个掩码数组,其中nans和infs被屏蔽掉:

print(np.ma.masked_invalid(a))
[[-- 2.0 3.0 --]
 [1.0 2.0 3.0 9.0]]
Run Code Online (Sandbox Code Playgroud)

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

a=np.ma.compress_cols(np.ma.masked_invalid(a))
print(a)
# [[ 2.  3.]
#  [ 2.  3.]]
Run Code Online (Sandbox Code Playgroud)

请参阅 操纵-maskedarray


Pau*_*aul 8

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

  b = a.compress(logical_not(z), axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 凉.我希望matlab的语法在这里工作:"a(:,z)= []"更简单 (2认同)
  • 类似:b = a [:,[1,2]] (2认同)

Oli*_*ier 6

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

a[:, -z]
Run Code Online (Sandbox Code Playgroud)

“-z”是布尔数组“z”的逻辑非。这与:

a[:, logical_not(z)]
Run Code Online (Sandbox Code Playgroud)


小智 6

来自Numpy文档

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])
Run Code Online (Sandbox Code Playgroud)