访问numpy数组的一部分

时间:2017-11-06 16:55:35

标签: python numpy

我有数据

A = np.array([1,2,3,4,5,6,7,8,9,10])
ind = np.array([0,1,4])
beg = 3

Aind的典型尺寸为数百万。

我想要做的是修改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中执行,还是应该坚持使用第一个代码?

2 个答案:

答案 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并递增。