作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的问题中,我有一个包含 n
元素的向量。给定窗口大小 k,我想有效地创建一个包含带状对角线的矩阵大小 n x 2k+1。例如:
a = [a_1, a_2, a_3, a_4]
k = 1
b = [[0, a_1, a_2],
[a_1, a_2, a_3],
[a_2, a_3, a_4],
[a_3, a_4, a_5],
[a_4, a_5, 0]]
实现这一点的简单方法是使用 for 循环
out_data = mx.ndarray.zeros((n, 2k+1))
for i in range(0, n):
for j in range(0, 2k+1):
index = i - k + j
if not (index < 0 or index >= seq_len):
out_data[i][j] = in_data[index]
这非常慢。
只需使用tile
和reshape
即可轻松创建完整矩阵,但 mask 部分并不清晰。
更新我发现了一个更快但仍然很慢的实现:
window = 2*self.windowSize + 1
in_data_reshaped = in_data.reshape((batch_size, seq_len))
out_data = mx.ndarray.zeros((seq_len * window))
for i in range(0, seq_len):
copy_from_start = max(i - self.windowSize, 0)
copy_from_end = min(seq_len -1, i+1+self.windowSize)
copy_length = copy_from_end - copy_from_start
copy_to_start = i*window + (2*self.windowSize + 1 - copy_length)
copy_to_end = copy_to_start + copy_length
out_data[copy_to_start:copy_to_end] = in_data_reshaped[copy_from_start:copy_from_end]
out_data = out_data.reshape((seq_len, window))
最佳答案
如果在您的操作中,k
和 n
是常数,您可以使用 mxnet.nd.gather_nd()
的组合来执行您想要的操作。和 mx.nd.scatter_nd
。尽管生成索引张量同样效率低下,因为您只需要执行一次,但这不会成为问题。您可能希望使用gather_nd
有效地“复制”原始数组中的数据,然后使用scatter_nd
将它们分散到最终的矩阵形状。或者,您可以简单地将 0
元素连接到输入数组(例如 [a_1, a_2, a_3]
将变成 [0, a_1, a_2, a_3]
),然后仅使用 mxnet.nd.gather_nd()
将元素复制到最终矩阵中。
关于python - 在 mxnet 中高效创建压缩带状对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909615/
我是一名优秀的程序员,十分优秀!