我有一个字符串数组,比如
arr = np.array(['A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'])
我想创建一个 Torch Tensor矩阵,其类型为将由Carnival乘积创建的对。因此,结果将是一个8x8Tensor,其中:
- 如果
row == 'A'
和列是col == 'B'
,则矩阵中的值例如是1
; - 如果
row == 'B'
和列是col == 'C'
,则矩阵中的值例如是2
, 0
否则(即如果row与col相同)。
我怎么才能做到这一点?
到目前为止,我已经尝试做了如下事情:
arr = np.array(['A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'])
_, arr = np.unique(arr, return_inverse=True)
arr = torch.tensor(arr)
arr += 1
out = torch.cartesian_prod(arr, arr).reshape(8, 8, 2)
out = out[:, :, 1] * out[:, :, 0]
torch.where(torch.sqrt(out) == torch.sqrt(out).int(), 0, out)
tensor([[0, 2, 2, 2, 3, 3, 3, 3],
[2, 0, 0, 0, 6, 6, 6, 6],
[2, 0, 0, 0, 6, 6, 6, 6],
[2, 0, 0, 0, 6, 6, 6, 6],
[3, 6, 6, 6, 0, 0, 0, 0],
[3, 6, 6, 6, 0, 0, 0, 0],
[3, 6, 6, 6, 0, 0, 0, 0],
[3, 6, 6, 6, 0, 0, 0, 0]])
但它感觉有点笨拙(甚至值都是相当随机的,而不是0,1,2.),所以我想听听其他的想法。
3条答案
按热度按时间72qzrwbm1#
结合合并网格和花式索引
对已发布解决方案的评论
原文中的方法有两个缺陷。
第一,两个 * 不相等 * 数的乘积的平方根可以是整数。例如,
1 * 4
的根是2,这是一个整数。因此,零将被插入作为像(1, 4), (2, 8), (3, 12), ...
这样的对的标识符,这当然不是故意的。接下来,将为一些不同的对设置相等的标识符。例如,在这个模型中,对
(1, 6)
和(2, 3)
的标识符为6。为了区分它们,有必要改变对它们的识别方式。新增解决方案
让我们基于
range(number_of_pairs).reshape(...)
为所有可能的对创建一个标识符矩阵:现在,我们为每对初始唯一值提供了唯一标识符,但标识符与对的顺序无关,对于两个值相等的对,标识符为零。
为了得到理想的答案,我们可以使用numpy.meshgrid来代替笛卡尔积和数组索引:
汇总代码及输出
输出量:
s71maibg2#
使用简单的广播和二进制编码:
输出量:
如果你想要从0到n的数字,再次因式分解:
输出量:
中间体:
vaqhlq813#
使用广播和字符串连接:
输出量:
最后,当然,
labels
可以用来创建torch.array
。