Python:检查列表中的每个元素是否都存在特定的时间
我有以下问题。我有一个这样的范围列表:Python:检查列表中的每个元素是否都存在特定的时间,python,arrays,numpy,scipy,Python,Arrays,Numpy,Scipy,我有以下问题。我有一个这样的范围列表: parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)] 我有一个numpy数组,如下所示: arr = np.array([[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0], [4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,
parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)]
我有一个numpy数组,如下所示:
arr = np.array([[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0],
[4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0],
[2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0],
[6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0],
[8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0],
[11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0],
[1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0],
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0]])
列表中的每个parameterRange元组都对应于numpy数组中的子数组。是否有办法检查相应范围内的所有元素是否至少存在一次?例如,在numpy数组的第一个子列表中,所有数字1、2、3、4、5至少存在一次,在第二个子列表中存在一次,在第三个列表中,例如数字1、2、3、4、5、6、7存在一次,依此类推。仅使用numpy函数可能有更有效的方法,但下面的代码可以工作。我想不出一个简单的Numpy方法来实现这一点,因为我们无法制作一个标准的Numpy数组,因为所有行的长度都不相同
import numpy as np
arr = np.array([
[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0],
[4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0],
[2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0],
[6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0],
[8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0],
[11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0],
[1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0],
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0]
])
parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)]
ranges = [np.arange(u, v+1, dtype='float64') for u, v in parameterRanges2]
print([np.all(np.isin(u,v)) for u, v in zip(ranges, arr)])
输出
[True, True, True, True, False, False, True, True]
可能有一种更有效的方法,只使用Numpy函数,但下面的代码可以工作。我想不出一个简单的Numpy方法来实现这一点,因为我们无法制作一个标准的Numpy数组,因为所有行的长度都不相同
import numpy as np
arr = np.array([
[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0],
[4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0],
[2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0],
[6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0],
[8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0],
[11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0],
[1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0],
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0]
])
parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)]
ranges = [np.arange(u, v+1, dtype='float64') for u, v in parameterRanges2]
print([np.all(np.isin(u,v)) for u, v in zip(ranges, arr)])
输出
[True, True, True, True, False, False, True, True]
利用范围是整数,我们可以给出一个O(nm)解,nxm是
arr
的形状。algo的工作原理如下:
- 丢弃所有非整型元素及其范围之外的所有元素
- 使用
有效地(O(mn))为范围内的数字生成二进制计数np.add.at
- 计算每行中高于阈值的存储箱数,并与范围进行比较
利用范围是整数,我们可以给出一个O(nm)解,nxm是
arr
的形状。algo的工作原理如下:
- 丢弃所有非整型元素及其范围之外的所有元素
- 使用
有效地(O(mn))为范围内的数字生成二进制计数np.add.at
- 计算每行中高于阈值的存储箱数,并与范围进行比较
may help may help OK nice,是否也有可能说范围内的数字应该至少符合2倍或3倍?@Varlor应该可以使用
np.add.at
我将尝试.TILnp.add.at
@PaulPanzer也可以对浮动范围这样做吗?致以最良好的祝愿@Varlor取决于细节,成本可能会更高(O(nm-log-nm))。用完整的例子提出一个新问题。好的,很好,是否也有可能说范围内的数字应该至少符合2倍或3倍?@Varlor应该可以使用np.add.at
我将尝试.TILnp.add.at
@PaulPanzer也可以对浮动范围这样做吗?致以最良好的祝愿@Varlor取决于细节,成本可能会更高(O(nm-log-nm))。用完整的例子提出一个新问题。好的,尼斯,是否也有可能说范围内的数字应该至少符合2倍或3倍?好的,尼斯,是否也有可能说范围内的数字应该至少符合2倍或3倍?