numpy 将1赋给2D数组中的索引的Python方法

ilmyapht  于 2023-03-30  发布在  Python
关注(0)|答案(2)|浏览(134)

我拥有的:

indexes = np.array([[4], [3], [2], [1]])

我想要的:

output = [[0, 0, 0, 0, 1], [0, 0, 0, 1, 0], [0, 0, 1, 0, 0], [0, 1, 0, 0, 0]]

因此,我不希望在输入的每个索引中有一个特定的数字,而是希望有一个长度为最大数字(这里是4)的数组,其中数字是新输出中的索引。
我可以用一个for循环来实现:

import numpy as np

indexes = np.array([[4], [3], [2], [1]])

one_hot = np.zeros(shape=(indexes.shape[0], np.max(input)))
for i in range(indexes.shape[0]):
    one_hot[i][input[i]] = 1
print(one_hot)

但是对于较大的数组来说,它是相当慢的,因此我正在寻找一种上级的方法。

ffvjumwh

ffvjumwh1#

您可以使用numpy索引:

a = np.array([[4], [3], [2], [1]])

out = np.zeros((len(a), a.max()+1), dtype=int)

out[np.arange(len(a)), a[:, 0]] = 1

out.tolist()

或者,使用广播:

out = (a == np.arange(a.max()+1)).astype(int)

out.tolist()
  • 注意:转换为列表可能是一个瓶颈。*

输出:

[[0, 0, 0, 0, 1], [0, 0, 0, 1, 0], [0, 0, 1, 0, 0], [0, 1, 0, 0, 0]]
ih99xse1

ih99xse12#

如果你只想创建一个包含1和0的2D数组,也许你可以尝试使用二进制。

max_len = 4
indexes = [4, 3, 2, 1]

out = []

for i in indexes:
    bin_val = bin(1 << (max_len-b)) # Binary value with ith bit from the right set. Type: string
    
    lst = list(bin_val[2:].zfill(max_len)) # Force the strings to be max_len (filled with 0s)
    
    out.append(lst)

你可以把这一切简化为

max_len = 4
indexes = [4, 3, 2, 1]
out = [ list ( bin (1 << (max_len - i) )[2:].zfill( max_len ) ) for i in indexes ]

两个代码的结果均应给予输出:

[['0', '0', '0', '1'], ['0', '0', '1', '0'], ['0', '1', '0', '0'], ['1', '0', '0', '0']]

就我个人而言,我只会使用一个1D数组,每个元素都是一个整数。它的二进制表示将直接给予我另一个维度的工作,也使任何形式的关系/计算容易使用位运算符。

相关问题