Есть ли простой способ сгенерировать два массива numpy из одного на основе одного логического теста? - PullRequest
0 голосов
/ 13 июля 2020

Есть ли простой способ сгенерировать два массива numpy из одного на основе одного логического теста?

import numpy as np
x = np.array([1,2,3,4,5,6,7,8])
y = x[x%2==0]
z = x[x%2==1]

Я не хочу выполнять второй тест для z. Очевидно, что z - это просто x с удаленными элементами из y. Могу ли я просто извлечь z из x с помощью y? Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

С новыми функциями сортировки, поддерживающими dtype, на самом деле довольно быстро выполнить argsort и разбить массив условий:

def pp():        
    order = cond.argsort(kind="stable")
    if cond[order[0]]:                          
        return a[:0],a                          
    elif not cond[order[-1]]:
        return a,a[:0]
    split = cond.searchsorted(True,sorter=order)
    return a[order[:split]],a[order[split:]]

def OP():
    return a[~cond],a[cond]


a = np.arange(1000)
cond = a%2 == 0

timeit(OP,number=1000)
# 0.012416471960023046
timeit(pp,number=1000)
# 0.009316607960499823
0 голосов
/ 13 июля 2020

Попробуйте следующее:

import numpy as np
x = np.array([1,2,3,4,5,6,7,8])
y = x[x%2==0]
z = y-1
...