回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我有一个简单的一维数组,比如:</p>
<p>[0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0]</p>
<p>我想知道使用numpy查找某个模式结束处的索引的最有效或最快的方法。我想找到的模式由两部分组成。第一部分包括所有内容,直到找到至少第n个连续的1(假设该阈值为3)。在那之后,这个模式应该被认为是在另一个连续的0被发现之后完成的。发生错误时,模式结束处的索引应存储在数组中以供以后使用。你知道吗</p>
<p>我可能没有很好地描述它,所以这里有一些代码可以实现我对上面相同数组的期望。你知道吗</p>
<pre><code>import numpy as np
arr = np.array([0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,1,1,0,1,0,1,0,0,0,0,0,1,0,1,1,0,1,1,0,1,1,0,0,0])
patternFound = False
threshold = 3
nonzerosCount = 0
zerosCount = 0
split_indexes=[]
for i in range(len(arr)):
if patternFound:
if arr[i] <= 0:
zerosCount += 1
else:
zerosCount = 0
if zerosCount >= threshold and i+1 != len(arr):
zerosCount = 0
patternFound=False
split_indexes.append(i+1)
else:
if arr[i] >= 1:
nonzerosCount += 1
else:
nonzerosCount = 0
if nonzerosCount >= threshold:
nonzerosCount = 0
patternFound = True
print "Indexes:", split_indexes
print "Split:",
for arr in np.split(arr, split_indexes):
print arr,',',
</code></pre>
<p>结果是:</p>
<p>索引:[15,35]
拆分:[0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0],[0 0 1 0 0 0 1 0 1 1 1 1 0 1 0 0 0],[0 0 1 0 1 0 1 0 1 0 0 0]</p>
<p>这对于像我示例中的小数组很好。但是,我想知道使用numpy实现这一点的更有效的方法。例如,如果我只想对一个更大的数组求和</p>
<pre><code>arr = np.random.uniform(size=1000000)
</code></pre>
<p>我只是重复了一遍:</p>
<pre><code>total = 0
for i in arr:
total += i
</code></pre>
<p>它比:</p>
<pre><code>np.sum(arr)
</code></pre>