Eu tenho um array 2D de (4,5) e outro array 2D de formato (4,2). O segundo array contém os índices inicial e final que eu preciso filtrar do primeiro array, ou seja, eu quero fatiar o primeiro array usando o segundo array.
np.random.seed(0)
a = np.random.randint(0,999,(4,5))
a
array([[684, 559, 629, 192, 835],
[763, 707, 359, 9, 723],
[277, 754, 804, 599, 70],
[472, 600, 396, 314, 705]])
idx = np.array([[2,4],
[0,3],
[2,3],
[1,3]
])
Saída esperada - pode ser qualquer um dos dois formatos a seguir. A única razão para preenchimento com zeros é que arrays 2d de comprimento variável não são suportados.
[[629, 192, 835, 0, 0],
[763, 707, 359, 9, 0],
[804, 599, 0, 0, 0],
[600, 396, 314, 0, 0]
]
[[0, 0, 629, 192, 835],
[763, 707, 359, 9, 0],
[0, 0, 804, 599, 0],
[0, 600, 396, 314, 0]
]
Outra solução possível, que utiliza:
np.arange
para criar um intervalo de índices de colunas com base no número de colunas ema
.Uma máscara booleana
m
é criada usando operações lógicas para verificar se cada índice de coluna cai dentro do intervalo especificado poridx
. Onp.newaxis
é usado para alinhar dimensões para transmissão.np.where
é usado para criara_mask
, onde os elementos ema
são substituídos por 0 se o valor correspondente emm
forFalse
.np.argsort
é usado para obter os índices que classificariam cada linha dem
(negado) em ordem crescente.np.take_along_axis
é usado para reorganizar os elementos coma_mask
base nos índices classificados.NB: Observe que
a_mask
contém a versão não classificada da solução (essa é essencialmente a abordagem seguida por @mozway).Saída:
Use transmissão e
numpy.arange
para calcular uma máscara, depois apliquenumpy.where
para selecionar osTrue
valores dea
e0
caso contrário:Saída:
Intermediários:
Se você quiser a primeira saída com os valores à esquerda, que é um pouco mais longa, você pode calcular os índices para preencher uma matriz de
zeros_like
:Saída:
Explicação dada como comentários dentro do código:
Provavelmente você pode tentar
o que dá