【发布时间】:2018-05-16 16:31:34
【问题描述】:
对于 排序 不等长度的numpy数组列表(比如M0、M1、M2)我想知道每个数组有多少个元素这些数组中的一个在由相邻的数组对给出的数字范围内(比如zbin。zbin 未排序,所述数字范围类似于以下[z[0], z[1]],@ 987654328@、[z[4], z[5]] 等等。zbin 总是有偶数个元素。)zbin 的未排序性质和相邻对的考虑在zbin 中查找数字范围使这个问题与Number of elements of numpy arrays inside specific bins 此处提出的问题不同。在上述链接中,zarr 已排序,相邻元素给出了数字范围(这里相邻对给出了数字范围)。
这就是我目前正在做的事情:
""" Function to do search query """
def search(numrange, lst):
arr = np.zeros(len(lst))
for i in range(len(lst)):
probe = lst[i]
count = 0
for j in range(len(probe)):
if (probe[j]>numrange[1]): break
if (probe[j]>=numrange[0]) and (probe[j]<=numrange[1]): count = count + 1
arr[i] = count
return arr
""" Some example of sorted one-dimensional arrays of unequal lengths """
M0 = np.array([5.1, 5.4, 6.4, 6.8, 7.9])
M1 = np.array([5.2, 5.7, 8.8, 8.9, 9.1, 9.2])
M2 = np.array([6.1, 6.2, 6.5, 7.2])
""" Implementation and output """
lst = [M0, M1, M2]
zbin = np.array([5.0, 5.2, 5.1, 5.3, 5.2, 5.4])
zarr = np.zeros( (len(zbin)/2, len(lst)) )
for i in np.arange(0, len(zbin)/2, 1):
indx = i*2
print indx
numrange = [zbin[indx], zbin[indx+1]]
zarr[i,:] = search(numrange, lst)
print zarr
输出是:
[[ 1. 1. 0.]
[ 1. 1. 0.]
[ 1. 1. 0.]]
这里,zarr 的第一行([1,1,0] 表明M0 在考虑的数字范围[5.0, 5.2] 中有1 元素,M1 有1 元素和M2 具有0 元素。第二行和第三行显示后续数字范围的结果,即 [5.1, 5.3] 和[5.2, 5.4]。)
我想知道实现此所需功能的最快方法是什么 (zarr)。在我的实际任务中,我将处理更大的zbin,以及更多的数组(M)。我将非常感谢任何帮助。
【问题讨论】:
-
使用您之前链接的问题的已接受解决方案中的
out[::2]? -
或者为了节省内存,使用
out = np.empty((len(zbin)//2, len(lst)),dtype=int)初始化,然后使用zbin[:-1:2]和zbin[1::2]来获取左右索引? -
Divakar:一如既往,这是一个很好的答案!非常感谢:)