【问题标题】:Check if array values are between two values of another array检查数组值是否在另一个数组的两个值之间
【发布时间】:2019-11-20 22:17:37
【问题描述】:

我有两个数组。一步到位:

steps = np.arange(0, 50, 2.5)
vect = np.random.normal(50, 5.6, 100)
index = [x for x in np.arange(len(a))]

我想检查vect 的每个元素是否一对steps 的元素之间。例如,如果vect[0] 在元素steps[0]steps[1] 之间,则返回True,否则返回False。所以vect 的每个项目将与steps 中的所有项目成对检查,​​如果这有意义的话。我在想这样的事情:

for x in index:
    for y in vect:
        print(steps[x] <= y <= steps[x+1])

这显然行不通。另外,我需要为每个 step 对创建一个单独的列表(它们实际上是数据框中的列)。不知道从这里去哪里。

【问题讨论】:

  • 你提到了DataFrame。你在用熊猫吗?
  • 是的,我是。我知道如何将它放入数据框中。我只是不知道检查数组的每个元素与另一个数组中的一对元素的逻辑和迭代

标签: python arrays loops numpy


【解决方案1】:

你可以像这样使用ufunc.outer

steps = np.arange(0, 22.5, 2.5)
vect = np.random.normal(10, 5.0, 10)

np.less.outer(vect,steps[1:]) & np.greater_equal.outer(vect,steps[:-1])

样本输出:

array([[False, False, False, False, False, False,  True, False],
       [False, False, False, False,  True, False, False, False],
       [False,  True, False, False, False, False, False, False],
       [False, False, False,  True, False, False, False, False],
       [False, False, False,  True, False, False, False, False],
       [False, False, False, False,  True, False, False, False],
       [False, False, False, False, False, False, False,  True],
       [False, False, False,  True, False, False, False, False],
       [False, False,  True, False, False, False, False, False],
       [False, False, False,  True, False, False, False, False]])

或作为数据帧

pd.DataFrame(np.less.outer(vect,steps[1:]) & np.greater_equal.outer(vect,steps[:-1]), columns=[f"{steps[i]:.1f}-{steps[i+1]:.1f}" for i in range(len(steps)-1)])

输出:

   0.0-2.5  2.5-5.0  5.0-7.5  7.5-10.0  10.0-12.5  12.5-15.0  15.0-17.5  17.5-20.0
0    False    False    False     False      False      False       True      False
1    False    False    False     False       True      False      False      False
2    False     True    False     False      False      False      False      False
3    False    False    False      True      False      False      False      False
4    False    False    False      True      False      False      False      False
5    False    False    False     False       True      False      False      False
6    False    False    False     False      False      False      False       True
7    False    False    False      True      False      False      False      False
8    False    False     True     False      False      False      False      False
9    False    False    False      True      False      False      False      False

【讨论】:

    【解决方案2】:
    steps = np.arange(0, 50, 2.5)
    vect = np.random.normal(50, 5.6, 100)
    indexes = {}
    for index, value in enumerate(steps):
        for value in vect:
            if index < len(steps)-1:
                if steps[index] < value < steps[index+1]:
                    indexes[value] = (index, index+1)
    

    最后你会得到一个字典,其中键是 vect 中的值,值是步骤中的间隔端点,作为元组。像这样:

      <class 'dict'>: {39.99995073703162: (15, 16), 
                       39.154971948950724: (15, 16), 
                       39.734181390461416: (15, 16)
                       44,5: (17, 18)}
    

    这是你需要的吗?

    通过一些重构,你可以使用 python 特定的东西把它做得更小

    使用 Lambda 函数更加简单。 https://thispointer.com/pandas-apply-apply-a-function-to-each-row-column-in-dataframe/

    使用 lambdas,第一个 for 被不礼貌地执行,第二个 for 可以写在一行中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多