请教下各位大佬,如何使用多笔transpose来代替单笔transpose?
有这个需求是因为dma本身的硬件限制。
比如说针对下面这个case
一个5d的tensor, shape = [4, 8, 16, 32, 64], permutation = [4, 3, 0, 2, 1].
通过numpy 可以一次转置成 [64, 32, 4, 16, 8], 也可以分成三次转置来变成 [64, 32, 4, 16, 8]。
这两种最终得到的结果是等价的,但是后者通过三次转置,每次转置的维度不超过三维,更容易被硬件接受。
所以有什么办法可以找到 针对任意permutation 来拆分成多次transpose的 通用解决办法呢?
sample code:
import numpy as np
in_data = np.arange(0, 4 * 8 * 16 * 32 * 64).reshape(4, 8, 16, 32, 64)
perm = [4, 3, 0, 2, 1]
gold = np.transpose(in_data, perm)
test = in_data
test = np.transpose(test, [3, 4, 0, 1, 2])
test = np.transpose(test, [0, 1, 2, 4, 3])
test = np.transpose(test, [1, 0, 2, 3, 4])
print(gold.shape)
print(test.shape)
np.testing.assert_array_equal(test, gold)
重写写了一个你再试试:
import numpy as np
def apply_transpose(seq, transpose):
return seq[:transpose[0]] + seq[transpose[0]:transpose[1]][::-1] + seq[transpose[1]:]
def search_transpose_seq_rec(target_perm, cur_perm, cur_seq, max_transpose_dim):
if cur_perm == target_perm:
return cur_seq
n = len(target_perm)
for i in range(n):
for j in range(i + 1, min(i + max_transpose_dim + 1, n + 1)):
new_perm = apply_transpose(cur_perm, (i, j))
new_seq = cur_seq + [(i, j)]
result = search_transpose_seq_rec(target_perm, new_perm, new_seq, max_transpose_dim)
if result:
return result
return None
def search_transpose_seq(target_perm, max_transpose_dim=3):
initial_perm = list(range(len(target_perm)))
return search_transpose_seq_rec(target_perm, initial_perm, [], max_transpose_dim)
src_shape = [4, 8, 16, 32, 64]
permutation = [4, 3, 0, 2, 1]
transpose_seq = search_transpose_seq(permutation)
print(transpose_seq) # 输出: [(0, 2), (1, 5), (2, 4)]
in_data = np.arange(0, 4 * 8 * 16 * 32 * 64).reshape(4, 8, 16, 32, 64)
gold = np.transpose(in_data, permutation)
test = in_data
for t in transpose_seq:
test = np.transpose(test, list(range(t[0])) + list(range(t[1], t[0] - 1, -1)) + list(range(t[1], len(permutation))))
print(gold.shape) # 输出: (64, 32, 4, 16, 8)
print(test.shape) # 输出: (64, 32, 4, 16, 8)
np.testing.assert_array_equal(test, gold)
Q1 这里有n个正整数,a1,....,an Alice 会先去掉其中最多d 个数 Bob 接下来会将剩余的数中最多m个数乘以 -k Alice 想要剩余数之和尽可能大,Bob 想要剩余数之和尽可能小。假设 Alice 和 Bob 都足够聪明,请问最后剩余数之和是多少。 输入描述 第一行一个正整数T,接下来有T组数据 每组数据2行 第一行4 个数 n, m, k, d (2 ≤ n ≤ 10^5)
1.旅游完所有景点需要的时间 第一行,一个整数N,表示有N个景点。第二行开始是景点信息,有三个整数,分别是优先级P(数字越小,优先级越高),首次预约日期X,允许再次前往的天数间隔D天(也就是预约时间变成:d+x*1/2/3)。输出要求,一个整数,表示完成旅游计划的天数。 Input 1: 3 3 2 3 1 3 2 2 2 2 output 1: 5 Input 2: 2 1 2 2 2 1 3
好像是25道单选题+3道编程题 原题没有复制下来,俺只记得大致意思,大家将就着看吧 第一题: 1、有俩哥们小A和小B玩游戏,每个游戏会有奖品(用数字和字母表示),相同的奖品(拿的顺序也必须相同)才能带回家,最多能带回多少件奖品 输入 3478297 3djakl7 输出 4 第二题: 信封嵌套问题,有n个信封,每个信封有长和宽,只有长宽比另一个信封的小,才能放进去,问最多能嵌套多少个信封 输入 4
有点伤感秋招不努力,都要毕业了这个时间点还在做笔试,按道理应该是去度假的。 第一题题意: 给定一个长度为n (n < 1e5) 的序列以及一个数m(1 < m < 1e5),序列中每个数的范围为0~1e9,求所有的位置p使得序列前p个数包含k组1~m的所有值。比如n=9,m=4,序列为[2, 3, 4, 1, 5, 1, 2, 3, 4],答案输出4和9。 第一题做法:搞个数组存一下1~m出现的次
360的算法笔试: 40道选择题 1.5分 2道编程题 20分 360的选择题感觉是最难的 涉及面太广了 除了算法 数据结构 文件 深度学习 还有什么矩阵 微分都有 编程系统和shopee一样最坑的赛马网不过可以本地ide 编程第一题很容易ac 第二题传染病没做出来
1. 暴力 dfs 可解 。一个数被3整除,则各个位之和,也是3的倍数。 2. 对于一个颜色,我们 只需要构建一个数组 preSum1, 对于 区间[L, R] 填充 1号色,只需 preSum1[L] += 1, preSum1[R + 1] -= 1;所有的颜色染完后,求preSum的前缀和,则第 i 个位置的值含义为:该点被染色的次数。对另一种颜色,也可以利用该方法解决。 但是该问题一个核心