此代码将选择列表“a”中的6个或更多正值
a=np.array([1.01, -1.58, 0.64, 1.38, 0.69, 0.91, 1.34, 1.03, 1.39, 0.94, -1.01,0.16])
b= np.zeros(13)
for i in range(6):
if (a[i] > 0 and a[i+1] > 0 and a[i+2] > 0 and a[i+3] > 0\
and a[i+4] > 0 and a[i+5] > 0 and a[i+6] > 0) :
b[i] = a[i]
b[i+1] = a[i+1]
b[i+2] = a[i+2]
b[i+3] = a[i+3]
b[i+4] = a[i+4]
b[i+5] = a[i+5]
b[i+6] = a[i+6]
我想把它缩短,我试过:
for i in range (6):
if (a[i:i+6]) > 0:
b[i:i+6] = a[i:i+6]
在缩短的版本中,您需要更改的主要内容是
if (a[i:i+6]) > 0:
。而且a
的长度是12,b
的长度是13。编辑1:(根据@Steve's comment below)此外,索引range
循环也可以从for i in range(6)
推广到for i in range(len(a)-5)
,因此:编辑2,根据@hpaulj's comment,因为
a
是一个numpy数组,我们不需要迭代切片,因为numpy将对数组(切片)的每个元素应用>
操作符,并返回一个[
True,
False, ...]
数组。第一个循环看起来是这样的:例如
a[0:0+6] > 0
返回array([ True, False, True, True, True, True])
一次只检查6个元素的一个显著缺点是,如果是一个较长的连续正数组,则将在下一个循环中填充它,并在
b
中过度写入相同的值。所以不是很优化。最好对索引进行显式检查,直到得到非正(或结束),并确保当前计数为>;6.重温这一点-我想我会添加这个替代方法,其中包括我在previous answer中提到的优化:
这个版本要长得多,需要手工编码每个正数序列的索引跟踪。但它有以下提到的主要性能优势
为什么这样更好:
b
,并使用相同的值进行重复写入b
李>相关问题 更多 >
编程相关推荐