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

时间:2015-02-25 22:22:08

标签: python arrays numpy

我有一个大的csv文件5300列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

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

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

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

我正在考虑使用类似的东西:

 data = delete(data[:,i:])

但不知道如何检查列的总和== 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 

这是输出:

 ['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.]]  

我需要它,因此第一列被删除,因为它的总和为'0'

2 个答案:

答案 0 :(得分:4)

应该是这样的:

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])

答案 1 :(得分:0)

如果有人对如何将其扩展到具有两个以上维度的数组感兴趣,则完成此任务的更简化的方法如下:

假设数组是一个三维数组(例如时间,纬度,经度),并且某些时间步长对于所有纬度和经度都具有零值,并且您希望删除这些时间步长。

new_data  = data[data.sum(axis=(1,2))>0]