除一个元素

时间:2019-03-08 18:02:14

标签: r rcpp

Rcpp中,我想找到一个向量的最大值,但是我想省略一个元素。

我有有效的代码,但是我确定我的方法很糟糕,因为它涉及向量的完整副本。有没有更好的方法来完成我想要的?

在R中:

vec <- 1:10
ele <- 3
max(vec[-ele])

我在Rcpp中的(糟糕)版本:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double my_fun(NumericVector vec, int ele) {
    NumericVector vec_no_ele = clone(vec);
    vec_no_ele.erase(ele);
    return max(vec_no_ele);
}

2 个答案:

答案 0 :(得分:1)

@Spacemen在评论中建议采用以下方法:

  

将要忽略的值保存在temp变量中。将该元素设置为零或某个小值或与向量中的另一个值相同。计算最大值重置temp变量中的元素。

这将像这样实现:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double max_no_copy(NumericVector vec, int ele) {
  double temp = vec[ele];

  // Use a value already in vector
  vec[ele] = vec[0];

  // Find max value
  double result_max = max(vec);

  // Remove NA value
  vec[ele] = temp;

  return result_max;
}

测试:

vec <- 1:10
ele <- 2 # C++ indices start at 0 not 1. So, subtract.

max_no_copy(vec, ele)
# [1] 10

以后要添加的基准...

答案 1 :(得分:1)

@coatless的答案很好,它建立在上面其他慷慨的评论者的基础上。但是,它可以进一步推广。 @coatless使用from bs4 import BeautifulSoup from bs4 import Tag soup = BeautifulSoup(open('x.html').read(), 'html.parser') #solution 1 print([x for x in soup.find('tr').contents if isinstance(x,Tag)]) #solution 2 with a custom function first_table=soup.find('table') def is_td_or_table(item): if isinstance(item,Tag): if item.name in ['td','table'] and item.find_parent("table") is first_table: return True print(first_table.find_all(is_td_or_table)) 中的值作为要忽略的值的占位符,但是当要忽略的值是元素0时,此操作将失败!

这是一个稍微笼统的解决方案,其中我将 Traceback (most recent call last): File "hand_gesture_classifier.py", line 67, in <module> button = Button(BUTTON_GPIO_PIN) File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 95, in __call__ self = super(GPIOMeta, cls).__call__(*args, **kwargs) File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 303, in __init__ pin, pull_up, bounce_time, pin_factory=pin_factory File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 338, in __init__ super(HoldMixin, self).__init__(*args, **kwargs) File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 100, in __init__ self.pin.when_changed = self._fire_events File "/usr/lib/python3/dist-packages/gpiozero/pins/__init__.py", line 388, in <lambda> lambda self, value: self._set_when_changed(value), File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 289, in _set_when_changed self._enable_event_detect() File "/usr/lib/python3/dist-packages/gpiozero/pins/rpigpio.py", line 219, in _enable_event_detect bouncetime=self._bounce) RuntimeError: Failed to add edge detection 的相邻元素用作占位符,并检查vec[0]是否在ele的索引中,并且检查{{1} }大于1:

ele