Mam duży zestaw danych, w których muszę porównać odległości zestawu próbek z tej tablicy ze wszystkimi innymi elementami tablicy. Poniżej znajduje się bardzo prosty przykład mojego zestawu danych.

import numpy as np
import scipy.spatial.distance as sd

data = np.array(
    [[ 0.93825827,  0.26701143],
     [ 0.99121108,  0.35582816],
     [ 0.90154837,  0.86254049],
     [ 0.83149103,  0.42222948],
     [ 0.27309625,  0.38925281],
     [ 0.06510739,  0.58445673],
     [ 0.61469637,  0.05420098],
     [ 0.92685408,  0.62715114],
     [ 0.22587817,  0.56819403],
     [ 0.28400409,  0.21112043]]
)


sample_indexes = [1,2,3]

# I'd rather not make this
other_indexes = list(set(range(len(data))) - set(sample_indexes))

sample_data = data[sample_indexes]
other_data = data[other_indexes]

# compare them
dists = sd.cdist(sample_data, other_data)

Czy istnieje sposób na indeksową tablicę dla indeksów, które nie są indeksami próbek? W moim powyższym przykładzie wykonuję listę o nazwie innych_indynacji. Wolałbym nie robić tego z różnych powodów (duży zestaw danych, gwintowanie, bardzo niską ilość pamięci w systemie, jest to uruchomione itd. Itd.). Czy istnieje sposób na zrobienie czegoś takiego ..

other_data = data[ indexes not in sample_indexes]

Przeczytałem, że numpy maski mogą to zrobić, ale próbowałem ...

other_data = data[~sample_indexes]

I to daje mi błąd. Czy muszę stworzyć maskę?

26
b10hazard 15 sierpień 2014, 21:11

3 odpowiedzi

Najlepsza odpowiedź
mask = np.ones(len(data), np.bool)
mask[sample_indexes] = 0
other_data = data[mask]

Nie najbardziej elegancki dla tego, co może być instrukcją jednorazową, ale jej dość wydajny, a nad głową pamięci jest również minimalna.

Jeśli pamięć jest twoim primerem, np.delete uniknąłoby tworzenia maski, a indeksowanie fantazyjne i tak tworzy kopię.

Po namyśle; NP.DELETE nie modyfikuje istniejącej tablicy, więc jej dokładnie dokładnie wyciągiem pojedynczej linii, której szukasz.

30
Eelco Hoogendoorn 15 sierpień 2014, 17:14

Możesz spróbować in1d

In [5]:

select = np.in1d(range(data.shape[0]), sample_indexes)
In [6]:

print data[select]
[[ 0.99121108  0.35582816]
 [ 0.90154837  0.86254049]
 [ 0.83149103  0.42222948]]
In [7]:

print data[~select]
[[ 0.93825827  0.26701143]
 [ 0.27309625  0.38925281]
 [ 0.06510739  0.58445673]
 [ 0.61469637  0.05420098]
 [ 0.92685408  0.62715114]
 [ 0.22587817  0.56819403]
 [ 0.28400409  0.21112043]]
11
CT Zhu 15 sierpień 2014, 17:49

Możesz także użyć setdiff1d:

In [11]: data[np.setdiff1d(np.arange(data.shape[0]), sample_indexes)]
Out[11]: 
array([[ 0.93825827,  0.26701143],
       [ 0.27309625,  0.38925281],
       [ 0.06510739,  0.58445673],
       [ 0.61469637,  0.05420098],
       [ 0.92685408,  0.62715114],
       [ 0.22587817,  0.56819403],
       [ 0.28400409,  0.21112043]])
3
Polor Beer 17 marzec 2018, 17:30