Есть ли функция, которая преобразует вектор из [1 0 1 0] в [1 0 0 0]? - PullRequest
0 голосов
/ 27 марта 2019

Я хочу сохранить первое '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]]

без петель.это был просто пример, мне нужно что-то, что работает с такими матрицами.

спасибо.

Ответы [ 4 ]

1 голос
/ 27 марта 2019

Вот как это можно сделать с помощью целых матричных операций:

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 как [0,0,1,0,0,0]

1 голос
/ 27 марта 2019

Я думаю, что проще всего использовать циклы, так как я не смог найти элегантного решения. Однако это должно работать:

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
0 голосов
/ 27 марта 2019

Вы можете создать пользовательскую функцию и использовать apply_along_axis для ее применения. Технически это не цикл, хотя он должен применяться к каждой строке в отдельности. Это может или не может соответствовать вашим требованиям.

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]])
0 голосов
/ 27 марта 2019

Допустим, ваш вектор называется vec, и вы хотите изменить число в позиции x, y на z.Вы можете использовать это:

vec[y][x] = z

Для этого вектора это будет:

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

Надеюсь, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...