我有下面的numpy数组:
import numpy as np
a = np.array([2,15,66,180])现在,我希望连续元素(diff) (除以25 )之间的差值总是小于或等于1 (diff/25 < 0)。
out = some_function(a,25)
out2,15,40,65,66,91,116,146,180
有什么智能的节能型方法可以做到吗?
发布于 2019-03-04 20:39:35
Numpy arange函数在那里可能有用,我会这样做:
import numpy as np
a = np.array([2,15,66,180])
out = np.array([])
for i in range(len(a)-1):
out = np.hstack((out,np.arange(a[i],a[i+1],25)))
out = np.hstack((out,a[-1:]))
print(out)产出:
[ 2. 15. 40. 65. 66. 91. 116. 141. 166. 180.]此解决方案假定为is平面数组。
编辑:在我注意到我的解决方案生成np.array of dtype float64之后,即输入的不同--取决于您的用法--它可能是一个问题,也可能不是一个问题。对于出现问题的情况,我将代码修改为以下形式:
import numpy as np
a = np.array([2,15,66,180])
print(a.dtype) #int64
out = np.hstack([np.arange(a[i],a[i+1],25) for i in range(len(a)-1)]+[a[-1:]])
print(out) #[ 2 15 40 65 66 91 116 141 166 180]
print(out.dtype) #int64代码也更短,但我保留了原始代码,因为它可能更容易理解。
发布于 2019-03-04 20:53:09
我比较过“GGandalf”和“Daweo”的方法。直觉地说,我会期望arange方法更有表现力。但情况正好相反。甘道夫的解决方案要快5倍。
不确定它对您的用例是否重要,但我发现指出它很有趣。
import timeit
setup_loop = """
import numpy as np
a = np.array([2,15,66,180])
def loop(a, step):
b = []
i = 0
x = a[i]
while i < a.size - 1:
if x >= a[i+1]:
i += 1
x = a[i]
b.append(x)
x += step
return b
"""
setup_array = """
import numpy as np
a = np.array([2,15,66,180])
def array(a, step):
out = np.array([])
for i in range(len(a) - 1):
out = np.hstack((out, np.arange(a[i], a[i + 1], step)))
out = np.hstack((out, a[-1:]))
return out
"""
print(timeit.repeat("loop(a, 25)", setup_loop, number=100000, repeat=3))
print(timeit.repeat("array(a, 25)", setup_array, number=100000, repeat=3))
>>>[0.687177968943061, 0.6732553936845722, 0.6689018746795448]
>>>[3.5879034464852912, 3.6017167518256006, 3.5779435401398842]发布于 2019-03-04 20:32:56
没有很好的数组数学,但它是通过增加计数器来工作的。我希望这就是你的意思,因为在你的问题中,你说diff/25 < 0应该是diff/25 <= 1
import numpy as np
a = np.array([2,15,66,180])
def some_function(a, step):
b = []
i = 0
x = a[i]
while i < a.size - 1:
if x >= a[i+1]:
i += 1
x = a[i]
b.append(x)
x += step
return b
print(some_function(a, 25))
>>> [2, 15, 40, 65, 66, 91, 116, 141, 166, 180]https://stackoverflow.com/questions/54990791
复制相似问题