2015-01-15 3 views
0

У меня есть массив (dtype = object) с первым столбцом, содержащим кортежи массивов, а второй столбец содержит скаляры. Я хочу, чтобы все скаляры были из второго столбца, где кортежи в первом столбце равны определенному кортежу.сравнить кортеж с кортежами в массиве numpy

Say

>>> X 
array([[(array([ 21.]), array([ 13.])), 0.29452519286647716], 
    [(array([ 25.]), array([ 9.])), 0.9106600600510809], 
    [(array([ 25.]), array([ 13.])), 0.8137344043493814], 
    [(array([ 25.]), array([ 14.])), 0.8143093864975313], 
    [(array([ 25.]), array([ 15.])), 0.6004337591112664], 
    [(array([ 25.]), array([ 16.])), 0.6239450452872853], 
    [(array([ 21.]), array([ 13.])), 0.32082105959687424]], dtype=object) 

, и я хочу, чтобы все строки, где первый столбец равен X [0,0].

ar = X[0,0] 
>>> ar 
(array([ 21.]), array([ 13.])) 

Я thaugh проверки X[:,0]==ar должны найти мне эти строки. Я бы тогда получил свой окончательный результат на X[X[:,0]==ar,1].

Что, кажется, происходит, однако, заключается в том, что ar получает интерпретировать как 2dimensional массив и каждый отдельный элемент в ar сравниваются с кортежами в X[:,0]. Это дает в этом случае массив 2x7 всех записей, равных False. Напротив, сравнение X[0,0]==ar работает так же, как хотелось бы, давая значение True.

Почему это происходит и как я могу исправить это, чтобы получить желаемый результат?

ответ

2

Сравнение используя список понимание работы:

In [176]: [x==ar for x in X[:,0]] 
Out[176]: [True, False, False, False, False, False, True] 

Это сравнение кортежей с кортежами

Сравнение кортежей идентификаторов дает другой результат

In [175]: [id(x)==id(ar) for x in X[:,0]] 
Out[175]: [True, False, False, False, False, False, False] 

, поскольку второй матч имеет другой идентификатор.

In [177]: X[:,0]==ar 
Out[177]: 
array([[False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False]], dtype=bool) 

возвращает результат (2,7), потому что это, сравнивая эффект (7,) массив с (2,1) массива (np.array(ar)).

Но это работает, как постижение:

In [190]: ar1=np.zeros(1,dtype=object) 

In [191]: ar1[0]=ar 

In [192]: ar1 
Out[192]: array([(array([ 21.]), array([ 13.]))], dtype=object) 

In [193]: X[:,0]==ar1 
Out[193]: array([ True, False, False, False, False, False, True], dtype=bool) 

art1 является 1 элемент массив А, содержащий ar кортежа. Теперь сравнение с элементами X[:,0] происходит так, как ожидалось.

np.array(...) пытается создать как высокий размерный массив, как позволяют входные данные. Вот почему он превращает 2-элементный кортеж в массив из 2 элементов. Мне пришлось сделать 2-х шаговое задание, чтобы обойти это значение по умолчанию.

Смежные вопросы