python

时间:2018-08-15 22:43:11

标签: python arrays performance numpy

因此,制作一个能够真正解释我想要的内容的标题比我想的要难,所以我在这里解释它。

我有一个填充有零的数组,该数组在每次满足条件时都会添加值,因此经过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

非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

我可能在这里没有收到您的问题,但是如果您想首先检查气泡大小是否在同一行元素的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:请问,根据我的例子,您能告诉我们您要寻找的最终阵列是什么吗?

答案 1 :(得分:0)

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

  • 您当前气泡大小(整数)和当前y值(整数)
  • 您有一个2D数组(prev_array),其中包含气泡大小和y坐标
  • 您要检查您当前的气泡大小是否在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]

然后我们使用indprev_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]])