因此,制作一个能够真正解释我想要的内容的标题比我想的要难,所以我在这里解释它。
我有一个填充有零的数组,该数组在每次满足条件时都会添加值,因此经过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
非常感谢您的帮助:)
答案 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)
据我了解(如果我错了,请纠正我):
prev_array
),其中包含气泡大小和y坐标prev_array
中每个存储的气泡大小的5%之内(无论哪种方式)您可以在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]])