小编aki*_*net的帖子

如何矢量化熊猫数据框正向列值搜索

我想仅在向前方向上搜索熊猫数据帧列中的目标值,如果找到更大的值,那么我想将索引差异记录为结果列。我已经设法用两个内部 for 循环来做到这一点,但它非常缓慢。

这就是我想在一个简化的例子中实现的目标。

import pandas as pd

d = {
    'Value'  : [8,9,10,12,16,13,11,7,12,18],
    'Target' : [12,12,11,15,19,11,16,11,17,18]
    }
df = pd.DataFrame(data=d)


>>> df

   Target  Value
0      12      8
1      12      9
2      11     10
3      15     12
4      19     16
5      11     13
6      16     11
7      11      7
8      17     12
9      18     18
Run Code Online (Sandbox Code Playgroud)

我们的第一个值是 8,我们的目标值是 12。我们期待在值列中找到一个超过这个目标值的值。我们在第 4 行找到它,值为 16。我要记录的是索引差异,即 4-0=4。

下一个值是 9,目标值是 12。我们向前看值并再次找到第 4 行,值为 16。现在索引差为 4-1=3

让我们跳到第 4 行。我们开始从索引 5 开始寻找目标值。如果没有找到值,则结果为 0。

这是我想要达到的结果列。

   Target  Value  Result
0 …
Run Code Online (Sandbox Code Playgroud)

python vectorization dataframe pandas

5
推荐指数
1
解决办法
145
查看次数

如何拥有“与等于不一致”的 TreeSet

我已经阅读了大量关于 TreeSets、Comparable/Comparator Interfaces、equals、compareTo、compare 方法的文章,我知道 API 说你必须使你的排序“与等于一致”,否则可能会发生奇怪的事情。

但就我而言,我认为这是一个相当普遍的情况,我确实需要一个“与等于不一致”的 TreeSet 排序。

假设我们正在进行某种启发式搜索,并且我们正在从根(初始)状态开始扩展(或生成)新状态。我们将新的(扩展/生成的)状态放入我们通常称为打开列表的 TreeSet 中。我们想使用 TreeSet 容器,因为我们不想在我们的打开列表中出现重复的状态。

生成/扩展的每个状态都通过成本函数进行评估,并给出一个启发式值,该值显示了状态的质量。我们想要按此值排序的 TreeSet(打开列表)。我们希望在 TreeSet 的顶部拥有最佳状态(具有最佳成本值)。

现在问题来了。为了适应按成本值排序,我们需要给 TreeSet 一个比较成本值的比较器。但是,两个不同的状态可以具有相同的成本/启发式值。我希望这两个状态都在我的公开列表中,因为它们不“相等”。但是比较器需要从比较方法中返回 0,因为它们具有相同的成本值。并且因为这样,具有相同成本值的不同状态将不会被插入到列表中。

我想举一个简单的例子来使这更容易理解。假设我们的状态是显示二进制数据的字符串,成本函数计算字符串中“1”的数量。

假设这些是生成的状态及其各自的成本值。

  No  State       Cost 
  1   01001001     3
  2   01101001     4
  3   10001001     3
  4   01001111     5
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这 4 个状态都是不同的。他们“不相等”。但是即使状态 1 和状态 3 不同,它们也具有相同的成本值“3”。因此,当我们按成本对 TreeSet 进行排序时,状态 3 将不会添加到 TreeSet 中,因为已经存在具有相同成本值的元素。但是我们需要将该状态添加到列表中,因为它是完全有效的、不同的、新的状态。

我怎样才能克服这个问题?

谢谢。

java equals compareto comparator treeset

3
推荐指数
1
解决办法
488
查看次数