Индексирование возвращает ошибку в Numpy после выравнивания - PullRequest
0 голосов
/ 26 июня 2018

Попытка проанализировать цифровую индексацию оси после выравнивания

X[np.argwhere(y==0).flatten(),0]

Снизу фрагмент:

def load_pts(csv_name):
    data = np.asarray(pd.read_csv(csv_name, header=None))
    X = data[:,0:2]
    y = data[:,2]

    plt.scatter(X[np.argwhere(y==0).flatten(),0], X[np.argwhere(y==0).flatten(),1],s = 50, color = 'blue', edgecolor = 'k')
    plt.scatter(X[np.argwhere(y==1).flatten(),0], X[np.argwhere(y==1).flatten(),1],s = 50, color = 'red', edgecolor = 'k')

    plt.xlim(-2.05,2.05)
    plt.ylim(-2.05,2.05)
    plt.grid(False)
    plt.tick_params(
        axis='x',
        which='both',
        bottom='off',
        top='off')

    return X,y

X, y = load_pts('data.csv')
plt.show()

И это работает:

enter image description here

Попробовал описанный выше сценарий из примера документации NumPy, но получил «Индекс вышел за пределы»

x = np.arange(6).reshape(2,3)
print(x)
print(np.argwhere(x>1))
print("--")
print(x[np.argwhere(x>1).flatten(), 0])

Исключение:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-14-e443d8218694> in <module>()
      3 print(np.argwhere(x>1))
      4 print("--")
----> 5 print(x[np.argwhere(x>1).flatten(), 0])

IndexError: index 2 is out of bounds for axis 0 with size 2

Однако то же самоеиндексация по нулевой оси работает в функции load_pts.Невозможно понять индексацию оси после выравнивания в строке 6,7 в функции load_pts.

Файл данных CSV

1 Ответ

0 голосов
/ 26 июня 2018

argwhere().flatten не имеет смысла:

In [100]: x = np.arange(6).reshape(2,3)
In [101]: x
Out[101]: 
array([[0, 1, 2],
       [3, 4, 5]])
In [102]: x>1
Out[102]: 
array([[False, False,  True],
       [ True,  True,  True]])
In [103]: np.where(x>1)
Out[103]: (array([0, 1, 1, 1]), array([2, 0, 1, 2]))

where возвращает индексный кортеж, такой что: x[np.where(x>1)] works

argwhere - транспонирование where - массив пар индекса (для 2d):

In [104]: np.argwhere(x>1)
Out[104]: 
array([[0, 2],
       [1, 0],
       [1, 1],
       [1, 2]])

flatten смешивает значения из двух измерений

In [105]: np.argwhere(x>1).flatten()
Out[105]: array([0, 2, 1, 0, 1, 1, 1, 2])

2 получены из результатов 2-гоизмерение (размер 3) и не работает при применении к 1-му измерению (размер 2).

Что вы пытаетесь сделать с этим flatten?


Вфрагмент кода большего размера, y - это массив 1d (data[:,2]).Там argwhere/flatten работает, но излишне сложно.

In [106]: x
Out[106]: 
array([[0, 1, 2],
       [3, 4, 5]])
In [107]: y = x[:,1]
In [108]: np.where(y>1)
Out[108]: (array([1]),)       # as single element tuple
In [109]: np.argwhere(y>1)
Out[109]: array([[1]])           # a (1,1) shape array
In [110]: np.argwhere(y>1).flatten()
Out[110]: array([1])             # a (1,) shape array

, но мы получаем то же самое, просто извлекая один элемент из кортежа:

In [111]: np.where(y>1)[0]
Out[111]: array([1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...