Per cominciare, mi piacerebbe provare:
def return_equals(*args):
x=[]
c=args[-1]
for a in args:
x.append(np.nonzero(np.in1d(a,c))[0])
return x
Se posso aggiungere un d=np.array([1,0,4,3,0])
(ha solo 1 partita ; che cosa se non ci sono partite)
poi
return_equals(a,b,d,c)
0123?
produce:
[array([2, 4], dtype=int32),
array([1, 3], dtype=int32),
array([2], dtype=int32),
array([0, 1], dtype=int32)]
Poiché la lunghezza di input e restituiti matrici possono differire, davvero non può vettorizzare il problema. Cioè, ci vuole un po 'di ginnastica speciale per eseguire l'operazione su tutti gli ingressi contemporaneamente. E se il numero di array è piccolo rispetto alla loro lunghezza tipica, non mi preoccuperei della velocità. L'iterazione di alcune volte non è costosa. Sta iterando oltre 100 valori che sono costosi.
È possibile, naturalmente, passare gli argomenti parola chiave su in1d
.
Non è chiaro cosa si sta tentando di fare con il parametro sorted_by
. È qualcosa che potresti facilmente applicare agli array prima di passarli a questa funzione?
versione di lista di questa iterazione:
[np.nonzero(np.in1d(x,c))[0] for x in [a,b,d,c]]
posso immaginare concatenando le matrici in uno più lungo, applicando in1d
, e poi dividere in su in sottoarray. C'è un np.split
, ma è necessario che tu gli dica quanti elementi inserire in ogni sottolista. Ciò significa, in qualche modo, determinare quante partite ci sono per ogni argomento. Fare ciò senza il loop potrebbe essere complicato.
I pezzi per questo (che devono ancora essere imballato come funzione) sono:
args=[a,b,d,c]
lens=[len(x) for x in args]
abc=np.concatenate(args)
C=np.cumsum(lens)
I=np.nonzero(np.in1d(abc,c))[0]
S=np.split(I,(2,4,5))
[S[0],S[1]-C[0],S[2]-C[1],S[3]-C[2]]
I
# array([ 2, 4, 6, 8, 12, 15, 16], dtype=int32)
C
# array([ 5, 10, 15, 17], dtype=int32)
Il (2,4,5)
sono il numero di elementi di I
fra valori successivi di C
, cioè il numero di elementi che corrispondono a ciascuno di a
, b
, ...
Ha sempre hanno valori unici all'interno di ciascuna di queste matrici di ingresso? – Divakar
I valori non sono ordinati ma unici sì. – Lukas