在Numpy中将一维离散值数组转换为n维连续值数组

3

如何最好地完成以下任务:给定一个离散变量大小为N的1-D数组(此处N=4),其中X是唯一元素的数量,我想创建一个大小为(N*X)的多维数组,其中元素的值为1或0,取决于1-D数组中元素的出现情况。例如,以下array_1D(N=4且X=3)将导致大小为3*4的array_ND:

array_1D = np.array([x, y, z, x])
array_ND = [[1 0 0 1]
            [0 1 0 0]
            [0 0 1 0]]

感谢您的来信。
Aso

你的结果不会是NxN——即使你的例子是3x4。 - Warren Weckesser
@WarrenWeckesser 你说得对。我在看到你的评论后纠正了问题。 - Aso Agile
2个回答

4

试试这个:

(np.unique(a)[..., None] == a).astype(np.int)

如果您想要一个布尔数组,可以省略 .astype(np.int) 部分。在这里,我们使用了广播[..., None] 部分),以避免显式循环。
如评论中所建议的,可以将其拆分为以下几部分:
>>> import numpy as np
>>> a = np.array([1, 2, 3, 1])
>>> unique_elements = np.unique(a)
>>> result = unique_elements[..., None] == a
>>> unique_elements
array([1, 2, 3])
>>> result
array([[ True, False, False,  True],
       [False,  True, False, False],
       [False, False,  True, False]], dtype=bool)

2
我正要给出几乎相同的答案。 :) 你应该将其分为两个步骤。用户将想要保存由np.unique(a)返回的数组,以了解数组中值的含义。 - Warren Weckesser
感谢@MrE的完美答案。Numpy真是太棒了! - Aso Agile

2
如果初始数组包含从 0n - 1 的有效索引,则您可以编写以下代码:
eye = np.eye(3)
array_1D = np.array([0, 1, 2, 0])
array_ND = eye[array_1D]

生成的矩阵将会是:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.]])

这里发生的事情是numpy使用array_1D的元素作为eye的行索引。因此,结果矩阵包含与array_1D元素一样多的行,每个元素都与相应的元素相关联。(01 0 0相关联,以此类推)这是你所期望的转置矩阵的一个变换形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接