Für Anfang, würde ich versuchen:
def return_equals(*args):
x=[]
c=args[-1]
for a in args:
x.append(np.nonzero(np.in1d(a,c))[0])
return x
Wenn ich einen d=np.array([1,0,4,3,0])
(es hat nur 1 Spiel hinzufügen ; was ist, wenn es keine Spiele)
dann
return_equals(a,b,d,c)
0123?
produziert:
[array([2, 4], dtype=int32),
array([1, 3], dtype=int32),
array([2], dtype=int32),
array([0, 1], dtype=int32)]
Da die Länge beider Eingangs und zurückgegebenen Arrays unterscheiden können, die Sie wirklich nicht das Problem vektorisieren kann. Das heißt, es bedarf einer speziellen Gymnastik, um die Operation über alle Eingaben gleichzeitig durchzuführen. Und wenn die Anzahl der Arrays im Vergleich zu ihrer typischen Länge klein ist, würde ich mir keine Gedanken über die Geschwindigkeit machen. Iterieren ein paar Mal ist nicht teuer. Es ist über 100 Werte iterieren, die teuer ist.
Sie könnten die Schlüsselwortargumente natürlich an in1d
übergeben.
Es ist nicht klar, was Sie mit dem Parameter sorted_by
zu tun versuchen. Ist das etwas, das Sie genauso einfach auf die Arrays anwenden könnten, bevor Sie sie an diese Funktion übergeben?
Liste Verständnis Version dieser Iteration:
[np.nonzero(np.in1d(x,c))[0] for x in [a,b,d,c]]
ich mir vorstellen kann, die Arrays in einem längeren verketten, Anwendung in1d
, und es dann nach oben in Sub-Arrays aufgeteilt wird. Es gibt eine np.split
, aber es erfordert, dass Sie ihm sagen, wie viele Elemente in jede Unterliste eingefügt werden sollen. Das bedeutet, irgendwie zu bestimmen, wie viele Übereinstimmungen es für jedes Argument gibt. Dies ohne Schleifen zu tun, könnte schwierig sein.
die Stücke dafür (die als Funktion müssen noch zu verpackende) sind:
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)
Die (2,4,5)
sind die Anzahl der Elemente von I
zwischen aufeinanderfolgenden Werten von C
, dh die Anzahl von Elementen, die für Match jeder von a
, b
, ...
Muss es immer eindeutige Werte innerhalb jeder dieser Eingabefelder? – Divakar
Die Werte sind nicht sortiert, aber eindeutig ja. – Lukas