De manera eficiente la clasificación y filtrado una JaggedArray por otro

votos
0

Esto es más una incómoda-array pregunta, pero está estrechamente relacionado con arrancar .

Tengo un JaggedArray( awkward.array.jagged.JaggedArray) que contiene índices que apuntan a posiciones en otro JaggedArray. Ambas matrices tienen la misma longitud, pero cada uno de los numpy.ndarraysque la JaggedArrayscontienen pueden ser de diferente longitud. Quisiera ordenar la segunda matriz utilizando los índices de la primera matriz, al mismo tiempo, dejando caer los elementos de la segunda matriz que no están en el índice de la primera matriz. La primera matriz puede contener, además, valores de -1(también podría ser reemplazado por Nonesi es necesario, pero esto no es actualmente ese caso) que quiere decir que no hay ninguna coincidencia en la segunda matriz. En tal caso, la posición correspondiente en la primera matriz se debe establecer en un valor predeterminado (por ejemplo 0).

Aquí está un ejemplo práctico y cómo resolver esto en el momento:

import uproot
import numpy as np
import awkward

def good_index(my_indices, my_values):
    my_list = []
    for index in my_indices:
        if index > -1:
            my_list.append(my_values[index])
        else:
            my_list.append(0)
    return my_list

indices = awkward.fromiter([[0, -1], [3,1,-1], [-1,0,-1]])
values = awkward.fromiter([[1.1, 1.2, 1.3], [2.1,2.2,2.3,2.4], [3.1]])

new_map = awkward.fromiter(map(good_index, indices, values))

El resultante new_mapes: [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]].

¿Hay una manera más eficiente / más rápido lograr esto? Estaba pensando que se podría utilizar numpyla funcionalidad como numpy.where, pero debido a las diferentes longitudes de la ndarrayspresente falla al menos para las formas que he probado.

Publicado el 09/10/2019 a las 18:57
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Si todos los subconjuntos en valuesse garantiza que sea no vacía (de modo que la indexación con -1rendimientos del último sub-elemento, no es un error), entonces usted puede hacer esto:

>>> almost = values[indices]       # almost what you want; uses -1 as a real index
>>> almost.content = awkward.MaskedArray(indices.content < 0, almost.content)
>>> almost.fillna(0.0)
<JaggedArray [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]] at 0x7fe54c713c88>

El último paso es opcional, ya que sin ella, los elementos que faltan son None, en lugar de 0.0.

Si algunos de los subconjuntos en valuesestán vacías, puede padellas para asegurar que tengan al menos un subelemento. Todos los sub-elementos originales se indexan de la misma manera que eran antes, ya que padsólo aumenta la longitud, si es necesario.

>>> values = awkward.fromiter([[1.1, 1.2, 1.3], [], [2.1, 2.2, 2.3, 2.4], [], [3.1]])
>>> values.pad(1)
<JaggedArray [[1.1 1.2 1.3] [None] [2.1 2.2 2.3 2.4] [None] [3.1]] at 0x7fe54c713978>
Respondida el 11/10/2019 a las 19:55
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more