在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);
}
答案 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