import matplotlib.pyplot as plt
import numpy as np
import itertools
v=np.random.random((2,50))
plt.plot(
*zip(*itertools.chain.from_iterable(itertools.combinations(v.T,2))),
marker='o', markerfacecolor='red')
plt.show()
Преимущество такого способа состоит в том, что звонков на plt.plot
меньше. Это должно быть значительно быстрее, чем методы, которые делают O (N ** 2) вызовов plt.plot
.
Обратите внимание, что вам не нужно наносить точки отдельно. Вместо этого вы можете использовать параметр marker='o'
.
Пояснение: я думаю, что самый простой способ понять этот код - это посмотреть, как он работает с простым v
:
In [4]: import numpy as np
In [5]: import itertools
In [7]: v=np.arange(8).reshape(2,4)
In [8]: v
Out[8]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
itertools.combination (..., 2) создает все возможные пары точек:
In [10]: list(itertools.combinations(v.T,2))
Out[10]:
[(array([0, 4]), array([1, 5])),
(array([0, 4]), array([2, 6])),
(array([0, 4]), array([3, 7])),
(array([1, 5]), array([2, 6])),
(array([1, 5]), array([3, 7])),
(array([2, 6]), array([3, 7]))]
Теперь мы используем itertools.chain.from_iterable , чтобы преобразовать этот список пар точек в (уплощенный) список точек:
In [11]: list(itertools.chain.from_iterable(itertools.combinations(v.T,2)))
Out[11]:
[array([0, 4]),
array([1, 5]),
array([0, 4]),
array([2, 6]),
array([0, 4]),
array([3, 7]),
array([1, 5]),
array([2, 6]),
array([1, 5]),
array([3, 7]),
array([2, 6]),
array([3, 7])]
Если мы нанесем эти точки одну за другой, соединенные линиями, мы получим наш полный график. Единственная проблема состоит в том, что plt.plot(x,y)
ожидает, что x
будет последовательностью x
-значений, а y
будет последовательностью y
-значений.
Мы можем использовать zip
, чтобы преобразовать список точек в список значений x и y:
In [12]: zip(*itertools.chain.from_iterable(itertools.combinations(v.T,2)))
Out[12]: [(0, 1, 0, 2, 0, 3, 1, 2, 1, 3, 2, 3), (4, 5, 4, 6, 4, 7, 5, 6, 5, 7, 6, 7)]
Использование оператора splat (*
) в zip
и plt.plot
- , объясненное здесь .
Таким образом, нам удалось втиснуть данные в правильную форму для подачи в plt.plot
.