我正在研究一种用于分析天气数据的工具。此时,所有数据都被加载到名为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或类似的东西创建新数组。 >
答案 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()的组合。起初我使用熊猫,但后来我意识到没有必要。
简而言之,我使用列表months
和years
的补语(当然,这需要知道数据集的最大时间段是多少[请参见列表{{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}}的“副本”。
那两条线确实能完成任务,实在令人惊讶! :)