有关已排序长度不等长度的数组(例如M0
,M1
,M2
)的列表,我想要找到这些数组中每个数组的元素数量是由相邻的数组对给出的数字范围(例如zbin
。zbin
未排序和所述数字范围类似于以下[z[0], z[1]]
,[z[2], z[3]]
,[z[4], z[5]]
等等。zbin
始终具有偶数个元素。)未排序的性质在zbin
zbin
中zarr
的{strong>相邻对的考虑因素来查找数字范围会使这个问题与此处提出的问题不同Number of elements of numpy arrays inside specific bins。在上述链接中,""" 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]
在所考虑的数字范围M1
中有 1 元素,{{ 1}}包含 1 元素,M2
包含 0 元素。第二行和第三行显示后续数字范围的结果, ie [5.1, 5.3]
和[5.2, 5.4]
。)
我想知道实现此所需功能的最快方法是什么(zarr
)。在我的实际任务中,我将处理更大的zbin
和更多的数组(M
)。我非常感谢任何帮助。
答案 0 :(得分:1)
不确定numpy会不会让你加速,但这是一次尝试:
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)), dtype=np.float)
for i,M in enumerate(lst):
zarr[:,i] = np.count_nonzero(np.logical_and(M >= zbin[::2, np.newaxis],
M <= zbin[1::2, np.newaxis]), axis=1)
In [10]: zarr
Out[10]:
array([[1., 1., 0.],
[1., 1., 0.],
[1., 1., 0.]])
顺便说一句,如果你可以利用数组的排序特性,来自链接问题的@Divakar解决方案肯定会更快。