如果条件为真,则删除 numpy 中的列

use*_*260 2 python arrays numpy

我有一个大型 csv 文件,5300 列 x 150 行。每列都有一个数字标题(第一列除外,它是字符串)。每行都有一个与其关联的样本名称。以下是格式示例:

 s,1,2,3,4,5,6
 a,0,8,7,6,0,5
 b,0,0,5,4,0,3
 c,0,2,3,4,0,3
 d,0,6,7,8,0,9
Run Code Online (Sandbox Code Playgroud)

我希望删除总和(不包括列标题)为零的所有列。最快的方法是什么?我尝试通过分割每一行、将“ith”元素添加到列表中并求和来迭代整个过程。如果总和 == 0,则再次迭代数据并从每行中删除“第 i”个元素。这种方法的问题是它花费了不切实际的时间,并且我可能需要对几个类似的文件重复该过程。

我有一些 python 经验,但对 numpy 完全陌生。我不确定如何根据条件(例如 sum == 0)按列删除。到目前为止我有:

 data = np.loadtxt('test.csv', delimiter=',', skiprows=1, usecols=range(1,5))
Run Code Online (Sandbox Code Playgroud)

我想使用类似的东西:

 data = delete(data[:,i:])
Run Code Online (Sandbox Code Playgroud)

但不知道如何检查列的总和 == 0 以及如何应用于整个数组。如果有人可以对此进行扩展或有更好的方法,请告诉我。谢谢

这是我的确切代码:

 import numpy as np

 with open('test.csv','r') as r:
     all_data = [line.strip() for line in r]

 titles = all_data[0].split(',')
 samples = []
 for i in all_data:
     samples.append(i.split(',')[0])

 print titles
 print samples

 data = np.loadtxt('test.csv', delimiter=',', skiprows=1, usecols=range(1,5))

 print data

 numeric_data = data[1:, 1:]
 columns_to_keep = np.concatenate([[True], np.sum(numeric_data, axis = 0) != 0])
 print columns_to_keep
 new_data = data[:, columns_to_keep]

 print new_data 
Run Code Online (Sandbox Code Playgroud)

这是输出:

 ['s', '1', '2', '3', '4', '5', '6']
 ['s', 'a', 'b', 'c', 'd']
 [[ 0.  8.  7.  6.]
  [ 0.  0.  5.  4.]
  [ 0.  2.  3.  4.]
  [ 0.  6.  7.  8.]]
 [ True  True  True  True]
 [[ 0.  8.  7.  6.]
  [ 0.  0.  5.  4.]
  [ 0.  2.  3.  4.]
  [ 0.  6.  7.  8.]]  
Run Code Online (Sandbox Code Playgroud)

我需要它,所以删除第一列,因为它的总和为“0”

Pet*_*ter 5

应该是这样的:

numeric_data = data[1:, 1:]
columns_to_keep = np.concatenate([[True], np.sum(numeric_data, axis = 0) != 0])
# Prepending True means you keep the first column
new_data = data[:, columns_to_keep])
Run Code Online (Sandbox Code Playgroud)