我想保留每行中出现的第一个'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循环。 这只是一个例子,我需要一些适用于这类矩阵的东西。
谢谢。
答案 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]])