numpy 有没有办法让Python中的每个矩阵列只有一个值?

e5nszbig  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(115)

此数组有6列。

u = np.array([[1, 0, 0, 1, 0, 0],
              [0, 0, 1, 0, 1, 0],
              [0, 0, 1, 1, 0, 0],
              [0, 0, 0, 1, 0, 0]])

字符串
我正在寻找一种方法,使每个矩阵列有一个单一的1值。第一列和第五列满足我的条件,因为它们只有一个值1。
因此,该过程可以使用随机来删除一些1,例如在具有两个1的第三列和具有3个1的第四列中。第二栏和第六栏没有变化。
在某些列中随机删除1后,我的预期结果可能如下所示:

u = np.array ([[1, 0, 0, 0, 0, 0],
               [0, 0, 0, 0, 1, 0],
               [0, 0, 1, 0, 0, 0],
               [0, 0, 0, 1, 0, 0]])


有人能告诉我如何实现这一点吗?

lvjbypge

lvjbypge1#

我想这就是你要找的:

import numpy as np

u = np.array([[1, 0, 0, 1, 0, 0],
              [0, 0, 1, 0, 1, 0],
              [0, 0, 1, 1, 0, 0],
              [0, 0, 0, 1, 0, 0]])

# Iterate through the columns
for i in range(u.shape[1]):
    #find 1s
    valid_indices = np.where(u[:, i] == 1)[0]
    if len(valid_indices) > 0:
        # Generate random index
        one_index = np.random.choice(valid_indices)
        # Put a 0 in all 1s
        u[u[:, i] == 1, i] = 0
        # Put the 1
        u[one_index, i] = 1

print(u)

字符串

pod7payv

pod7payv2#

可以使用cumsum来屏蔽每列中第一次出现的1。如果你想保留最后一个,你可以使用负步骤索引:

u=np.array([[1, 0, 0, 1, 0, 0],
            [0, 0, 1, 0, 1, 0],
            [0, 0, 1, 1, 0, 0],
            [0, 0, 0, 1, 0, 0]])

u[::-1,:] *= np.cumsum(u[::-1,:],axis=0) == 1

print(u)

[[1 0 0 0 0 0]
 [0 0 0 0 1 0]
 [0 0 1 0 0 0]
 [0 0 0 1 0 0]]

字符串
要只保留第一个,直接使用矩阵(不使用负步进):

u *= np.cumsum(u,axis=0) == 1

[[1 0 0 1 0 0]
 [0 0 1 0 1 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]]

相关问题