是否有将[1 0 1 0]的向量转换为[1 0 0 0]的函数?

时间:2019-03-27 17:41:48

标签: python numpy

我想保留每行中出现的第一个'1'。

示例:我有一个矩阵(向量数组):

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

我想要这样:

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

没有for循环。 这只是一个例子,我需要一些适用于这类矩阵的东西。

谢谢。

4 个答案:

答案 0 :(得分:1)

我认为使用循环最简单,因为我找不到理想的解决方案。但是,这应该可行:

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

b = np.copy(a)
b[np.arange(len(a.shape[0])),np.argmax(a,axis=1)] = 0
a = a-b

答案 1 :(得分:1)

以下是整个矩阵操作的完成方式:

result = (np.cumsum(n,axis=1)*n==1).astype(int)

np.cumsum将[0,0,1,0,0,1]变成[0,0,1,1,1,2]。与n的乘积将使零保持在原来的位置,并且只会对行中的前1个产生1 * 1 = 1。因此,[0,0,1,0,0,2] == 1产生[False,False,True,False,False,False]并将其转换为int的{​​{1}}

答案 2 :(得分:0)

比方说,您的向量命名为vec,并且您想要将位置x, y的数字更改为z。您可以使用:

vec[y][x] = z

对于此向量,将为:

vec[4][5] = 0
vec[5][5] = 0

希望这行得通。

答案 3 :(得分:0)

您可以创建一个自定义函数,并使用apply_along_axis对其进行应用。从技术上讲,这不是一个for循环,尽管它确实必须单独应用于每一行。那可能符合或可能不符合您的要求。

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

def make_zero(x):
    x[x.argmax()+1:]=0
    return x

np.apply_along_axis(make_zero, 1,n)

array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])