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

标签 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

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

我有一些 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”

最佳答案

应该是这样的:

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

关于python - 如果条件为真,则删除 numpy 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730805/

相关文章:

python - 函数不打印所有偶数?

python - 连接两个 Pyspark 数据帧的两种方法有什么区别

javascript - 二维中点分割逻辑

python - 为什么 x <= x 为假?

python - numpy 轴数的明确权威解释?

python - 是否存在运算符(operator)错误,因为执行后它说不明确错误。我在做什么错误?

python - Django API : Upload user files to S3 using Celery to make process async

python - 如何在 celery - rabbitmq 设置中设置消费者优先级?

javascript - Vue JS 使用数组来过滤另一个数组?

java - 当我尝试运行这个程序时,是什么导致了我的 java.lang.NullPointerException 错误?