2016-07-21 4 views
0

У меня есть массив numpy X с формой (768, 8).Извлечь строки из массива python в python

Последнее значение для каждой строки может быть либо 0 или 1, я хочу только строки со значением 1, и называем это T.

я сделал:

T = [x for x in X if x[7]==1] 

Это правильно, однако, теперь это список, а не NumPy массив (на самом деле я не могу напечатать T.shape).

Что мне делать вместо того, чтобы сохранить это массив numpy?

+1

Почему не просто 'T = np.array (T)' ?? – ThePredator

+0

Итак, просто сохраните код для T и преобразуйте его обратно в массив numpy? – user

ответ

2

Numpy получает работу в полностью векторизованном образе. Этот подход, как правило, более эффективен (и, возможно, более изящный), чем использование списков и преобразований типов.

T = X[X[:, -1] == 1] 

Демо:

In [232]: first_columns = np.random.randint(0, 10, size=(10, 7)) 

In [233]: last_column = np.random.randint(0, 2, size=(10, 1)) 

In [234]: X = np.hstack((first_columns, last_column)) 

In [235]: X 
Out[235]: 
array([[4, 3, 3, 2, 6, 2, 2, 0], 
     [2, 7, 9, 4, 7, 1, 8, 0], 
     [9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [9, 8, 7, 6, 4, 4, 9, 0], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 1, 4, 5, 2, 4, 7, 0], 
     [8, 0, 0, 1, 5, 2, 6, 0], 
     [7, 9, 9, 3, 9, 3, 9, 1], 
     [3, 1, 8, 7, 3, 2, 9, 0]]) 

In [236]: mask = X[:, -1] == 1 

In [237]: mask 
Out[237]: array([False, False, True, True, False, True, False, False, True, False], dtype=bool) 

In [238]: T = X[mask] 

In [239]: T 
Out[239]: 
array([[9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 9, 9, 3, 9, 3, 9, 1]]) 
+1

Вы также можете использовать X.compress (mask, axis = 0) для более явных/меньших затрат. При использовании индексов строк вместо маски вы можете использовать X.take (rowxs, axis = 0). Причудливое индексирование Numpy вызывает эти функции под капотом. – Erotemic

+0

Спасибо, это тоже учит меня чему-то – user

0

Позвонив

T = [x for x in X if x[8]==1] 

вы делаете T в виде списка. Для того, чтобы преобразовать его в любой список в Numpy массива, просто используйте:

T = numpy.array([x for x in X if x[8]==1]) 

Вот что происходит: логическое индексирование

In [1]: import numpy as np 

In [2]: a = [1,2,3,4] 

In [3]: a.T 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-3-9f69ed463660> in <module>() 
----> 1 a.T 

AttributeError: 'list' object has no attribute 'T' 

In [4]: a = np.array(a) 

In [5]: a.T 
Out[5]: array([1, 2, 3, 4]) 

In [6]: 
+0

Итак, мне нужен промежуточный проход к списку и обратно к матрице numpy. Прямой конверсии нет. – user

+0

@user: Проверьте изменение. Вы можете просто сказать: 'numpy.array ([x для x в X, если x [8] == 1])' – ThePredator

+0

Да, это то же самое. Мне просто интересно, была ли предпочтительная операция numpy. Во всяком случае, это работает, спасибо. – user