【问题标题】:Value in an array between two numbers in pythonpython中两个数字之间的数组中的值
【发布时间】:2018-08-15 22:43:10
【问题描述】:

所以制作一个真正解释我想要的标题比我想象的要难,所以我来解释一下。

我有一个用零填充的数组,每次满足条件时都会添加值,所以在 1 个时间步迭代之后,我得到了这样的结果(减去标题):

current_array =

bubble_size y_coord
14040       42
3943        71
6345        11
0           0
0           0
....

在这个时间步完成后,这个 current_array 被设置为 previous_array 并用零擦除,因为每次都没有保证的条目数。

现在真正的问题是我希望能够检查 previous_array 第一列中的所有行,并查看当前气泡大小是否在任何一侧的 5% 以内,如果是,我想拿走当前的 y 位置与previous_array的第二列中匹配的气泡大小数字相关联的值。

目前我有类似的东西;

if bubble_size in current_array[:, 0]:
    do_whatever

但我不知道如何在不使用循环的情况下提取关联的 y_coord,我可以这样做(数组大约有 100 行,至少有 1000 个时间步长,所以我想让它像可能)但想避免

我已经包含了我对 for 循环的想法(注意 current 和 previous_array 实际上是 current 和 previous_frame)

for y in range (0, array_size):
    if bubble_size >> previous_frame[y,0] *.95 &&<< previous_frame[y, 0] *1.05:
        distance_travelled = current_y_coord - previous_frame[y,0]
        y = y + 1

非常感谢任何帮助:)

【问题讨论】:

  • 您能否提供一个示例说明您希望输出的样子?
  • 不使用 Numba 或 Cython 吗?

标签: python arrays performance numpy


【解决方案1】:

我可能没有在这里找到您的问题,但如果您想首先检查气泡大小是否在同一行元素之间 95 % 您可以使用以下内容:

import numpy as np

def apply(p, c):  # For each element check the bubblesize grow
    if(p*0.95 < c < p*1.05):
        return 1
    else:
        return 0


def dist(p, c):  # Calculate the distance
    return c-p

def update(prev, cur):
    assert isinstance(
        cur, np.ndarray), 'Current array is not a valid numpy array'
    assert isinstance(
        prev, np.ndarray), 'Previous array is not a valid numpy array'
    assert prev.shape == cur.shape, 'Arrays size mismatch'

    applyvec = np.vectorize(apply)
    toapply = applyvec(prev[:, 0], cur[:, 0])

    print(toapply)

    distvec = np.vectorize(dist)
    distance = distvec(prev[:, 1], cur[:, 1])

    print(distance)


current = np.array([[14040, 42],
                [3943,71],
                [6345,11],
                [0,0],
                [0,0]])

previous = np.array([[14039, 32],
                [3942,61],
                [6344,1],
                [0,0],
                [0,0]])

update(previous,current)

PS:请问,根据我的示例,您能告诉我们您要寻找的最终数组是什么吗?

【讨论】:

    【解决方案2】:

    据我所知(如果我错了,请纠正我):

    • 您有当前的气泡大小(整数)和当前的 y 值(整数)
    • 您有一个包含气泡大小和 y 坐标的二维数组 (prev_array)
    • 您想检查您当前的气泡大小是否在prev_array 中存储的每个气泡大小的 5% 以内(无论哪种方式)
    • 如果它们在范围内,则从存储的 y 坐标中减去当前的 y 值
    • 这将生成一个新数组,其中仅包含范围内的气泡大小以及新减去的 y 值
    • 您希望在没有显式循环的情况下执行此操作

    您可以在 numpy 中使用布尔索引来做到这一点...

    设置上一个数组:

    prev_array = np.array([[14040, 42], [3943, 71], [6345, 11], [3945,0], [0,0]])
    
    prev_array
    
    array([[14040,    42],
           [ 3943,    71],
           [ 6345,    11],
           [ 3945,     0],
           [    0,     0]])
    

    您已经存储了要用于比较的气泡大小,以及当前的 y 坐标值:

    bubble_size = 3750
    cur_y = 10
    

    接下来我们可以创建一个布尔掩码,我们只选择满足 5% 标准的 prev_array 行:

    ind = (bubble_size > prev_array[:,0]*.95) & (bubble_size < prev_array[:,0]*1.05)
    
    # ind is a boolean array that looks like this: [False,  True, False,  True, False]
    

    然后我们使用ind 索引prev_array,并计算新的(减去的)y 坐标:

    new_array = prev_array[ind]
    new_array[:,1] = cur_y - new_array[:,1]
    

    给出你的最终输出数组:

    array([[3943,  -61],
           [3945,   10]])
    

    由于不清楚您希望输出实际是什么样子,因此您也可以使用新的 y 值更新 prev_array,而不是创建新数组:

    ind = (bubble_size > prev_array[:,0]*.95) & (bubble_size < prev_array[:,0]*1.05)
    prev_array[ind,1] = cur_y - prev_array[ind,1]
    

    这给出了:

    array([[14040,    42],
           [ 3943,   -61],
           [ 6345,    11],
           [ 3945,    10],
           [    0,     0]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多