使用 Python 定义时间循环
Defining a time loop using Python
此代码使用给定标准扫描相邻元素。比如从
开始
0.26373153 并选择 0.58720689,因为标准表明 select 个元素小于 0.6。同样,它从 0.58720689 移动到 0.54531058。随附当前输出和所需输出。
如何获得每次迭代的时间输出?
假设时间循环从 t=0 开始,表示 0.26373153,然后 t>0 表示下一个值:0.58720689,0.54531058,...
import numpy as np
def get_neighbor_indices(position, dimensions):
'''
dimensions is a shape of np.array
'''
i, j = position
indices = [(i+1,j), (i-1,j), (i,j+1), (i,j-1)]
return [
(i,j) for i,j in indices
if i>=0 and i<dimensions[0]
and j>=0 and j<dimensions[1]
]
def iterate_array(init_i, init_j, arr, condition_func):
'''
arr is an instance of np.array
condition_func is a function (value) => boolean
'''
indices_to_check = [(init_i,init_j)]
checked_indices = set()
result = []
while indices_to_check:
pos = indices_to_check.pop()
if pos in checked_indices:
continue
item = arr[pos]
checked_indices.add(pos)
if condition_func(item):
result.append(item)
indices_to_check.extend(
get_neighbor_indices(pos, arr.shape)
)
return result
#P1 = np.random.rand(10,10)
P1=np.array([[ 1.40591794, 0.26373153, 0.98327887, 11.26958535, 1.25191783],
[ 0.54531058, 0.58720689, 0.54674676, 3.89351201, 3.73486589],
[ 0.50904881, 0.16939308, 0.27069582, 0.61941143, 0.88792361],
[ 0.61828522, 0.30061379, 0.62551028, 0.28315714, 0.989013 ],
[ 0.39175302, 0.30969749, 1.59701676, 2.11862101, 0.81709991]])
T=iterate_array(0,1, P1, lambda x : x < 0.6)
print(T)
当前输出为
[0.26373153, 0.58720689, 0.54531058, 0.50904881, 0.16939308, 0.27069582, 0.54674676, 0.30061379, 0.30969749, 0.39175302]
此外,带有每个值的时间戳的所需输出应如下所示。这些值只是为了演示,因为我真的不知道实际的时间循环会显示什么。
[0,0.01,0.013,....]
我不确定你需要什么。如果您需要计算代码在看到另一个小于 0.6 的值之前尝试了多少次,这可以很容易地创建一个变量,该变量在每次迭代时增加并在您找到“正确”值时设置为 0。
如果您需要计算它运行了多少时间才能找到另一个小于 0.6 的值,您需要使用 time
库。指令 t1 = time.time()
在 t1 中保存自 epoch 以来经过的秒数(epoch 是 1970 年 1 月 1 日,00:00:00 ) 作为浮点数(请参阅 here 了解更多详情),因此当您开始研究时,您会在一个变量(比如 t1)中节省时间,当您在数组中找到一个小于 0.6 的值时,您会节省时间在另一个变量中是当前时间(例如 t2),此时要知道您需要计算多少时间(t2-t1);然后将t2的值存入t1,继续这样。
编辑:通过您的编辑,我了解了您的需求。
试试这个,但记得添加 import time
:
def iterate_array(init_i, init_j, arr, condition_func):
'''
arr is an instance of np.array
condition_func is a function (value) => boolean
'''
indices_to_check = [(init_i,init_j)]
checked_indices = set()
result = []
t0 = None
t1 = None
timestamps = []
while indices_to_check:
pos = indices_to_check.pop()
if pos in checked_indices:
continue
item = arr[pos]
checked_indices.add(pos)
if condition_func(item):
result.append(item)
t1=time.time()
if(t0==None):
t0=t1
timestamps.append(t1-t0)
indices_to_check.extend(
get_neighbor_indices(pos, arr.shape)
)
return result,timestamps
....
T,timestamps=iterate_array(0,1, P1, lambda x : x < 0.6)
print(T)
print(timestamps)
此代码使用给定标准扫描相邻元素。比如从
开始
0.26373153 并选择 0.58720689,因为标准表明 select 个元素小于 0.6。同样,它从 0.58720689 移动到 0.54531058。随附当前输出和所需输出。
如何获得每次迭代的时间输出? 假设时间循环从 t=0 开始,表示 0.26373153,然后 t>0 表示下一个值:0.58720689,0.54531058,...
import numpy as np
def get_neighbor_indices(position, dimensions):
'''
dimensions is a shape of np.array
'''
i, j = position
indices = [(i+1,j), (i-1,j), (i,j+1), (i,j-1)]
return [
(i,j) for i,j in indices
if i>=0 and i<dimensions[0]
and j>=0 and j<dimensions[1]
]
def iterate_array(init_i, init_j, arr, condition_func):
'''
arr is an instance of np.array
condition_func is a function (value) => boolean
'''
indices_to_check = [(init_i,init_j)]
checked_indices = set()
result = []
while indices_to_check:
pos = indices_to_check.pop()
if pos in checked_indices:
continue
item = arr[pos]
checked_indices.add(pos)
if condition_func(item):
result.append(item)
indices_to_check.extend(
get_neighbor_indices(pos, arr.shape)
)
return result
#P1 = np.random.rand(10,10)
P1=np.array([[ 1.40591794, 0.26373153, 0.98327887, 11.26958535, 1.25191783],
[ 0.54531058, 0.58720689, 0.54674676, 3.89351201, 3.73486589],
[ 0.50904881, 0.16939308, 0.27069582, 0.61941143, 0.88792361],
[ 0.61828522, 0.30061379, 0.62551028, 0.28315714, 0.989013 ],
[ 0.39175302, 0.30969749, 1.59701676, 2.11862101, 0.81709991]])
T=iterate_array(0,1, P1, lambda x : x < 0.6)
print(T)
当前输出为
[0.26373153, 0.58720689, 0.54531058, 0.50904881, 0.16939308, 0.27069582, 0.54674676, 0.30061379, 0.30969749, 0.39175302]
此外,带有每个值的时间戳的所需输出应如下所示。这些值只是为了演示,因为我真的不知道实际的时间循环会显示什么。
[0,0.01,0.013,....]
我不确定你需要什么。如果您需要计算代码在看到另一个小于 0.6 的值之前尝试了多少次,这可以很容易地创建一个变量,该变量在每次迭代时增加并在您找到“正确”值时设置为 0。
如果您需要计算它运行了多少时间才能找到另一个小于 0.6 的值,您需要使用 time
库。指令 t1 = time.time()
在 t1 中保存自 epoch 以来经过的秒数(epoch 是 1970 年 1 月 1 日,00:00:00 ) 作为浮点数(请参阅 here 了解更多详情),因此当您开始研究时,您会在一个变量(比如 t1)中节省时间,当您在数组中找到一个小于 0.6 的值时,您会节省时间在另一个变量中是当前时间(例如 t2),此时要知道您需要计算多少时间(t2-t1);然后将t2的值存入t1,继续这样。
编辑:通过您的编辑,我了解了您的需求。
试试这个,但记得添加 import time
:
def iterate_array(init_i, init_j, arr, condition_func):
'''
arr is an instance of np.array
condition_func is a function (value) => boolean
'''
indices_to_check = [(init_i,init_j)]
checked_indices = set()
result = []
t0 = None
t1 = None
timestamps = []
while indices_to_check:
pos = indices_to_check.pop()
if pos in checked_indices:
continue
item = arr[pos]
checked_indices.add(pos)
if condition_func(item):
result.append(item)
t1=time.time()
if(t0==None):
t0=t1
timestamps.append(t1-t0)
indices_to_check.extend(
get_neighbor_indices(pos, arr.shape)
)
return result,timestamps
....
T,timestamps=iterate_array(0,1, P1, lambda x : x < 0.6)
print(T)
print(timestamps)