我需要一种快速的方法来保持一个numpy数组的运行最大值.例如,如果我的数组是:
x = numpy.array([11,12,13,20,19,18,17,18,23,21])
Run Code Online (Sandbox Code Playgroud)
我想要:
numpy.array([11,12,13,20,20,20,20,20,23,23])
Run Code Online (Sandbox Code Playgroud)
显然我可以通过一个小循环来做到这一点:
def running_max(x):
result = [x[0]]
for val in x:
if val > result[-1]:
result.append(val)
else:
result.append(result[-1])
return result
Run Code Online (Sandbox Code Playgroud)
但我的阵列有数十万个条目,我需要多次调用它.似乎必须有一个笨拙的技巧来删除循环,但我似乎找不到任何可行的东西.另一种方法是将其写为C扩展,但似乎我要重新发明轮子.
我需要在另一个数组中找到第一个小于或等于一个数组元素的索引.一种有效的方法是:
import numpy
a = numpy.array([10,7,2,0])
b = numpy.array([10,9,8,7,6,5,4,3,2,1])
indices = [numpy.where(a<=x)[0][0] for x in b]
Run Code Online (Sandbox Code Playgroud)
索引的值为[0,1,1,1,2,2,2,2,3,3],这正是我所需要的.问题当然是python"for"循环很慢,我的数组可能有数百万个元素.这有什么不好的伎俩吗?这不起作用,因为它们的数组长度不同:
indices = numpy.where(a<=b) #XXX: raises an exception
Run Code Online (Sandbox Code Playgroud)
谢谢!
用未知(编译时)数量的变量填充变量的最佳方法是什么?例如,让我们说:
int n = 5;
int b = fillwithones(5);
Run Code Online (Sandbox Code Playgroud)
现在b包含11111(二进制).
我不能只是硬编码int b = 31因为n未提前知道(在我的应用程序中).
我可以这样做:
int b = pow(2, n) - 1
Run Code Online (Sandbox Code Playgroud)
但使用战俘似乎非常浪费.
谢谢!