我有一个数字列表,称其为“列表”,长度为l,最大N。所需的输出是一个形状为[l,N]的numpy数组,其中每一行的list [row_index]为1s,后跟0s其余的。
我已经使用for循环完成了此操作,但我尝试不对非顺序问题使用循环,因为numpy通常会采用一种很酷的方式来处理它。
示例:
Input:
N=5
list = [3,
2,
4,
2,
1,
0]
Desired Output:
[[1, 1, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
我尝试过的方式:
for i in range(len(list)):
list[i] = np.concatenate(np.ones(list[i]), np.zeros(N-list(i)))
我得到了正确的结果,只是感觉也有一种更优雅的“麻木”方式。有什么想法吗?
答案 0 :(得分:1)
这将起作用:
l = [3, 2, 4, 2, 1, 0]
N = 5
np.where(np.arange(N) >= np.array(l)[np.newaxis].T, 0, 1)
这将在第一个维度中创建一个包含数字范围的数组,在第二个维度中创建一个基于l
的数组。大于或等于l
中对应元素的每个元素都设置为0,小于等于1的每个元素都设置为
例如,这意味着对于l
(3)中的第一个元素,结果集中将有3个元素设置为1。
输出:
array([[1, 1, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])