【问题标题】:Python - Remove a row from numpy array?Python - 从 numpy 数组中删除一行?
【发布时间】:2011-02-18 19:10:54
【问题描述】:

大家好,对于这里的某个人来说,我不应该真的很简单。我想在一个循环中从一个 numpy 数组中删除一行,例如:

for i in range(len(self.Finalweight)):
        if self.Finalweight[i] >= self.cutoffOutliers:
            "remove line[i from self.wData"

我正在尝试从数据集中删除异常值。我的完整代码os方法如下:

def calculate_Outliers(self):
    def calcWeight(Value):
        pFinal = abs(Value - self.pMed)/ self.pDev_abs_Med
        gradFinal = abs(gradient(Value) - self.gradMed) / self.gradDev_abs_Med
        return pFinal * gradFinal

    self.pMed = median(self.wData[:,self.yColum-1])
    self.pDev_abs_Med = median(abs(self.wData[:,self.yColum-1] - self.pMed))
    self.gradMed = median(gradient(self.wData[:,self.yColum-1]))
    self.gradDev_abs_Med = median(abs(gradient(self.wData[:,self.yColum-1]) - self.gradMed))    
    self.workingData= self.wData[calcWeight(self.wData)<self.cutoffOutliers]

    self.xData = self.workingData[:,self.xColum-1]
    self.yData = self.workingData[:,self.yColum-1]

我收到以下错误:

文件“bin/dmtools”,第 201 行,在 plot_gride 中 self.calculate_Outliers() 文件“bin/dmtools”,第 188 行,在 calculate_Outliers 中 self.workingData= self.wData[calcWeight(self.wData)>self.cutoffOutliers] ValueError: 数组索引过多

【问题讨论】:

  • 如果您要删除很多元素,那么创建一个新数组并用通过截止值的值填充它可能会更快。每次使用 numpy 数组调用 remove 都会强制进行大量值交换,以将删除索引后的所有元素向下移动。此外,如果您要删除元素,您的循环将无法工作。
  • @Canesin:好的,在循环中进行逻辑构造(如果真的有必要,但很可能它也可以被矢量化),然后一步(正如我建议的那样)构造一个基于你的条件。
  • @Canesin:看来你的for i in range(... 结构可以用简单的语句`self.wData= self.wData[self.Finalweight>= self.cutoffOutliers] 代替,对吗?另一个观察结果是,如果您的计算变量本质上是时间变量,则无需将它们视为实例变量。谢谢
  • @eat: self.wData= self.wData[self.Finalweight>= self.cutoffOutliers] 给出 [] 但我确信 wData statisfy 中有很多行
  • @Canesin:如果你还没有实现你的for i in range(... construct,你怎么能确定呢?无论如何,这些是我的一般指导方针,如何避免在循环中删除 numpy-array 的行、列或元素。我根本没有考虑你实际的self.Finalweight 计算逻辑。请澄清我建议的从numpy-array 处理“删除项目”的方法是否不适用于您。谢谢

标签: python arrays numpy


【解决方案1】:

实际上 NumPy 中有一个工具专门用于屏蔽异常值和无效数据点:masked arrays。链接页面中的示例:

x = numpy.array([1, 2, 3, -1, 5])
mx = numpy.ma.masked_array(x, mask=[0, 0, 0, 1, 0])
print mx.mean()

打印

2.75

【讨论】:

  • 你也可以简单地使用x[x!=-1].mean()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2011-03-10
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多