回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个数组,它是不同块的串联:</p>
<pre><code>a = np.array([0, 1, 2, 10, 11, 20, 21, 22, 23])
# > < > < > <
chunks = np.array([3, 2, 4])
repeats = np.array([1, 3, 2])
</code></pre>
<p>在上面的例子中,从新的十年开始的每个部分都是一个单独的“块”,我想重复一下。每个组块的大小和重复次数都是已知的。我无法执行后跟<code>kron</code>或<code>repeat</code>的重塑,因为块的大小不同</p>
<p>我想要的结果是</p>
<pre><code>np.array([0, 1, 2, 10, 11, 10, 11, 10, 11, 20, 21, 22, 23, 20, 21, 22, 23])
# repeats:> 1 < > 3 < > 2 <
</code></pre>
<p>这在循环中很容易做到:</p>
<pre><code>in_offset = np.r_[0, np.cumsum(chunks[:-1])]
out_offset = np.r_[0, np.cumsum(chunks[:-1] * repeats[:-1])]
output = np.zeros((chunks * repeats).sum(), dtype=a.dtype)
for c in range(len(chunks)):
for r in range(repeats[c]):
for i in range(chunks[c]):
output[out_offset[c] + r * chunks[c] + i] = a[in_offset[c] + i]
</code></pre>
<p>这将导致以下矢量化:</p>
<pre><code>regions = chunks * repeats
index = np.arange(regions.sum())
segments = np.repeat(chunks, repeats)
resets = np.cumsum(segments[:-1])
offsets = np.zeros_like(index)
offsets[resets] = segments[:-1]
offsets[np.cumsum(regions[:-1])] -= chunks[:-1]
index -= np.cumsum(offsets)
output = a[index]
</code></pre>
<p>有没有更有效的方法来矢量化这个问题?我们很清楚,我不是在要求代码审查。我很满意这些函数调用是如何协同工作的。我想知道是否有一种完全不同的(更有效的)函数调用组合可以用来实现相同的结果</p>
<p>这个问题是受{a1}到{a2}启发提出的</p>