Jak mogę pobrać wiersze, dla których druga kolumna jest równa 4 lub 6?numpy: jak wybierać wiersze w oparciu o kilka kryteriów
a = np.array(np.mat('1 2; 3 4; 5 6; 7 4'))
b = [4,6]
Najwyraźniej to nie działa:
c = a[a[:,1] in b]
Jak mogę pobrać wiersze, dla których druga kolumna jest równa 4 lub 6?numpy: jak wybierać wiersze w oparciu o kilka kryteriów
a = np.array(np.mat('1 2; 3 4; 5 6; 7 4'))
b = [4,6]
Najwyraźniej to nie działa:
c = a[a[:,1] in b]
można użyć itertools.ifilter
:
from itertools import ifilter
c = np.array([ e for e in ifilter(lambda x: x[1] in b, a) ])
>> array([[3,4],
[5,6],
[7,4]])
[X do X w jeśli x [1] (4,6,)] powinien zrobić to dla przypadku, o którym wspomniałeś.
Edycja: As @georgesl sugeruje, że "idealny sposób" polega na użyciu iteratora przy konstruowaniu tablicy zamiast używania metody numpy.mat w łańcuchu.
To samo zastrzeżenie co do odpowiedzi georgesla: jest to niepotrzebnie powolne, ponieważ nie używa wektoryzowanych operacji NumPy. –
larsmans Tak jak to jest uzasadnione, że nie jest zoptymalizowany pod kątem takich operacji, to nadal jest ważny, jak komentuje @ georgesl. OP nie zawiera żadnych wyraźnych wskazówek dotyczących używania dużych tablic. – techiev2
można zrobić:
check = np.logical_or(a[:,1]==4, a[:,1]==6)
c = a[check,:]
Można również użyć |
do logicznego operatora or
:
check = (a[:,1]==4) | (a[:,1]==6)
numpythonic sposobem osiągnięcia tego celu byłoby wykorzystanie in1d
, coś jak:
a[np.in1d(a[:, 1], b)]
Jest to bardzo powolne w przypadku dużych tablic. Podczas pracy z tablicami NumPy preferowane są wektoryzowane idiomy. –
co ci mówi, że OP używa dużych tablic? Używam szeroko Numpy bez pracy przy Big Data. – lucasg