如何从数组中消除特定行?

时间:2019-02-26 16:08:45

标签: python python-3.x numpy matrix

我正在研究一种用于分析天气数据的工具。此时,所有数据都被加载到名为master_array的n×10矩阵中,该矩阵包含该数据作为float64数据类型。我构建了一些过滤器,允许用户指定应用于进一步计算的年份和月份。这些过滤器生成列表,例如。 G。一个从2008年到2010年的年份包含years=[2008, 2009, 2010]之类的整数的列表,或者从8月到10月的另一个列表包含months=[8, 9, 10]的整数。 master_array的最后一列包含收集数据的年份,月份之前的列,依此类推。

我现在要努力解决的问题是构建一个函数,该函数检查master_array的最后一列是否与列表years的元素匹配,并删除所有来自master_array的匹配项。 如果列表years为空,则所有可用数据应暂时保存在master_array中。

下一步基本上是相同的,但是在master_array中最后一列之前是该列,并且当然使用列表months而不是years

我不能保证master_array中的值已排序,但是函数必须对矩阵进行过滤。

我很确定我必须使用numpys delete()和argwhere(),但是我愿意寻求任何简单而整洁的解决方案来解决此问题。

谢谢。

编辑:
对我来说,非常重要的是保留master_array或至少一个副本,并删除不再需要的行,而不是使用vstack或类似的东西创建新数组。 >

2 个答案:

答案 0 :(得分:0)

您可以将掩码与Some text here一起使用,然后用被掩码的数组替换该数组。 这是numpy推荐的方法

  

通常最好使用布尔掩码。例如:

     

mask = np.ones(len(arr),dtype = bool)mask [[0,2,4]] =错误的结果=   arr [mask,...]

     

等效于np.isin,但允许进一步   使用np.delete(arr, [0,2,4], axis=0)

示例:

mask

结合年份和月份并使用import numpy as np #step 1: create an array with values and years (for illustration) values = np.random.random(10) years = np.array([2001, 2002, 2002, 2003, 2001, 2004, 2005, 2001, 2009, 2008]) master = np.vstack((values, years)).T print(master[:,1]) # this will print master second column, i.e. years >> ([2001, 2002, 2002, 2003, 2001, 2004, 2005, 2001, 2009, 2008]) # step 2: specify what years I want, then filter using a mask filt_years = [2001, 2002] mask = np.isin(master[:,1], filt_years) print(mask) #False values will be deleted >> [ True True True False True False False True False False] #step 3: apply mask and replace master (easier than deleting) master = master[mask] # or if you want to use delete: master = np.delete(master, np.arange(len(master))[~mask], axis=0) 的示例(即月份和年份都必须在所选集中):

logical_and

答案 1 :(得分:0)

感谢大家的建议。我终于解决了我的问题,而没有使用numpy的delete()和argwhere()的组合。起初我使用熊猫,但后来我意识到没有必要。 简而言之,我使用列表monthsyears的补语(当然,这需要知道数据集的最大时间段是多少[请参见列表{{1} }(在下面的示例中),这没问题,因为所有内容都包含在我的all_years中,并且借助补码,我可以实现从master_array中排除所有不符合过滤条件的行,最终完全我在找什么!

为您提供最终代码的示例:

master_array

请注意,我在上一行中创建了名为for i in [x for x in all_years if x not in years]: #list containing the complement to the years chosen by user as filter master_arrayFilter = master_arrayFilter[master_arrayFilter[:,9] != i] 的{​​{1}}的“副本”。

那两条线确实能完成任务,实在令人惊讶! :)