我有数据
A = np.array([1,2,3,4,5,6,7,8,9,10])
ind = np.array([0,1,4])
beg = 3
A
和ind
的典型尺寸为数百万。
我想要做的是修改A
中索引为ind+beg
的数据。
for i in range(0,ind.size):
A[ind[i]+beg] += 1
由于A
(+1
)上的操作几乎与将beg
添加到ind[i]
的操作相同,
我想避免这种情况。
在C代码中,我通常使用指针来完成此操作。
int* ptA = A-beg;
for(int i=0; i<indsize; i++) ptA[ind[i]]++;
是否可以以类似的方式在python中执行,还是应该坚持使用第一个代码?
答案 0 :(得分:4)
我认为您var xhr, timeout;
function listener() {
xhr = $.get('http://localhost:3000/get-value', function (dataf) {
if (dataf.result != "") {
$.ajax({
url: "http://localhost:8000/login",
data: { pId: dataf.result },
type: "POST",
success: function (result) {
if (result.name != "") {
$.get('http://localhost:3000/close-conn');
window.location.href = result.url;
}
}
});
}
timeout = setTimeout(listener, 1000);
});
}
function GetCheckStatus() {
var flag = chkAuto.GetValue();
if (flag) {
$.ajax({
url: "http://localhost:3000/open-conn",
type: "GET",
});
listener();
} else {
$.ajax({
url: "http://localhost:3000/close-conn",
type: "GET",
});
//Cancel the current request and prevent the next one from being triggered
xhr.abort();
clearTimeout(timeout);
}
}
方法的等价物是:C
,它可以节省一些额外费用。 A[beg:][ind]+=1
是一个无缓冲的版本,如果add.at
有需要
重复的价值观它通常比较慢。
ind
A=arange(10010)
ind=np.unique(randint(0,10000,1000))
beg = 3
In [236]: %timeit for i in range(0,ind.size): A[ind[i]+beg] += 1
3.01 ms ± 313 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [237]: %timeit A[beg+ind]+=1
39.8 µs ± 5.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [238]: %timeit A[beg:][ind]+=1
33.3 µs ± 2.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [239]: %timeit add.at(A[beg:],ind,1)
151 µs ± 10.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
或Numba
可以进一步加快此操作:
Cython
答案 1 :(得分:0)
Numpy具有强大的索引功能,这些功能在此处记录:https://docs.scipy.org/doc/numpy/user/basics.indexing.html
在您的情况下,您可以这样做:
>>> A[ind+beg] += 1
这会将beg
添加到ind
的每个成员,然后在这些位置编入A
并递增。