странное поведение numpy.asmatrix или matplotlib.pyplot.scatter

Я обнаружил странное поведение Python, numpy или matplotlib.

Пожалуйста, выполните следующий код с pylab на ipython:

>>> import numpy as np
>>> import numpy.random as nr
>>> import matplotlib.pyplot as mp
>>> data = nr.rand(50, 2)
>>> mp.scatter(data[:, 0], data[:, 1])
>>> trans = np.asmatrix(data.T)
>>> mp.scatter(trans[0, :], trans[1, :])
>>> all(data == trans.T)

Я ожидал, что две фигуры, созданные с помощью этого кода, будут абсолютно одинаковыми, но выглядят они немного по-разному. Последняя строка кода также подразумевает, что они точно такие же.

В чем проблема?

Python 2.7.4, IPython 0.13.2, pylab 1.7.1, numpy 1.7.1, matplotlib 1.2.0


person keisuke    schedule 19.06.2013    source источник
comment
Где две фигуры? Вы рисуете одну и ту же фигуру.   -  person YXD    schedule 19.06.2013
comment
Кроме того, вы генерируете случайные данные, поэтому цифры будут выглядеть по-другому, если вы снова запустите их без заполнения...   -  person YXD    schedule 19.06.2013
comment
Извините, моя точка зрения не то, что вы упомянули. Моя точка зрения заключается не в построении одной и той же фигуры или случайного начального числа, а в том, что разброс (данные) и разброс (транс) не имеют одинаковой формы.   -  person keisuke    schedule 19.06.2013
comment
Я не смог воссоздать вашу ошибку. Это весь код?   -  person jniles    schedule 19.06.2013
comment
Вы имеете в виду, что вы не можете видеть две фигуры? Я думаю, что вы можете увидеть фигуру сначала в scatter(), а затем, пожалуйста, закройте окно фигуры, а затем в следующем scatter() вы увидите другую фигуру. Мой вопрос в том, что эти две фигуры должны быть одинаковой формы, но это не так.   -  person keisuke    schedule 19.06.2013


Ответы (1)


np.asmatrix() просто преобразует итерацию в матрицу, когда это применимо. Так:

 trans = np.asmatrix(data.T)
 np.all( data == trans.T )

всегда должен давать True

Проблема с разными графиками заключается в том, что в matplotlib.axes.Axes.scatter ravel() выполняется в модуле numpy.ma (Masked Arrays). Здесь, несмотря на data==trans.T, np.ma.ravel(trans[0,:]) возвращает матрицу вместо сплющенного массива. Чтобы исправить это, вы можете вызвать np.ravel(), который работает для немаскированных массивов. Я открыл эту проблему в GitHub, чтобы сообщить об этом, что, возможно, является ошибкой...

Результат будет:

fig, axs = mp.subplots(nrows=1, ncols=2, sharey=True )

axs[0].scatter(data[:, 0], data[:, 1])

trans = np.asmatrix(data.T)

axs[1].scatter( np.ravel(trans[0,:]), np.ravel(trans[1,:]) )

fig.tight_layout()

давая вам это:

введите здесь описание изображения

person Saullo G. P. Castro    schedule 19.06.2013
comment
Да, но я имею в виду, что эти две субфигуры должны быть совершенно одинаковой формы, но это не так. - person keisuke; 19.06.2013
comment
Я видел проблему в GitHub этой проблемы. Я решил использовать numpy.array, чем numpy.matrix, когда передаю матрицы функциям numpy. Однако numpy.matrix прост и полезен, когда я хочу умножить... В любом случае, большое спасибо. - person keisuke; 20.06.2013
comment
@keisuke, вы должны продолжать использовать объекты np.ndarray, а для умножения просто делайте a.dot(b)... проблема на GitHub все еще открыта... - person Saullo G. P. Castro; 24.05.2014
comment
В дополнение, это было (лучше) задокументировано и будет в документах 1.4.0. github.com/matplotlib/matplotlib/pull/3394 - person tacaswell; 22.08.2014