что не так с этим красивым сообщением об ошибке - PullRequest
1 голос
/ 24 марта 2020

У меня есть словарь под названием Rsize, в котором число-список является парой ключ-значение. Словарь такой:

{10: [0.6621485767296484, 0.6610747762560114, 0.659607022086639, 0.6567761845867727, 0.6535392433801197, 0.6485977028504701, 0.6393024556394106, 0.6223866436257335, 0.5999232392636733, 0.5418403536642005, 0.4961461379219235, 0.4280278015788386, 0.35462315989740956, 0.2863017237662875, 0.2312185739351389, 0.18306363413831017], 12: [0.6638977494825118, 0.663295576452323, 0.662262804664348, 0.6610413916318628, 0.6590939627030634, 0.655212304186114, 0.6492141689834672, 0.6380632834031537, 0.6096663492242224, 0.5647498006858608, 0.4983281599318278, 0.3961350546063216, 0.32119092575707087, 0.2257230704567207, 0.1816695139119151, 0.14363448808684576], 14: [0.6649598494971014, 0.6644370245269158, 0.6638578972784479, 0.6630511299276417, 0.6615070373022596, 0.6596206155163766, 0.6560628158033714, 0.6487119276511941, 0.6343385358239866, 0.5792725000508062, 0.49799837531709923, 0.42482204326408324, 0.26633662071414366, 0.2028085235063155, 0.12411214668987203, 0.09336935548451253]}
[0.6621485767296484, 0.6610747762560114, 0.659607022086639, 0.6567761845867727, 0.6535392433801197, 0.6485977028504701, 0.6393024556394106, 0.6223866436257335, 0.5999232392636733, 0.5418403536642005, 0.4961461379219235, 0.4280278015788386, 0.35462315989740956, 0.2863017237662875, 0.2312185739351389, 0.18306363413831017]


Ключи 10,14,16. Я использовал каждый список для построения и хочу выяснить их попарно точки пересечения. Для этого я написал следующий скрипт и использовал функцию фигурного пересечения для определения точек пересечения.

from shapely.geometry import LineString
Rsize={10: [0.6621485767296484, 0.6610747762560114, 0.659607022086639, 0.6567761845867727, 0.6535392433801197, 0.6485977028504701, 0.6393024556394106, 0.6223866436257335, 0.5999232392636733, 0.5418403536642005, 0.4961461379219235, 0.4280278015788386, 0.35462315989740956, 0.2863017237662875, 0.2312185739351389, 0.18306363413831017], 12: [0.6638977494825118, 0.663295576452323, 0.662262804664348, 0.6610413916318628, 0.6590939627030634, 0.655212304186114, 0.6492141689834672, 0.6380632834031537, 0.6096663492242224, 0.5647498006858608, 0.4983281599318278, 0.3961350546063216, 0.32119092575707087, 0.2257230704567207, 0.1816695139119151, 0.14363448808684576], 14: [0.6649598494971014, 0.6644370245269158, 0.6638578972784479, 0.6630511299276417, 0.6615070373022596, 0.6596206155163766, 0.6560628158033714, 0.6487119276511941, 0.6343385358239866, 0.5792725000508062, 0.49799837531709923, 0.42482204326408324, 0.26633662071414366, 0.2028085235063155, 0.12411214668987203, 0.09336935548451253]}
[0.6621485767296484, 0.6610747762560114, 0.659607022086639, 0.6567761845867727, 0.6535392433801197, 0.6485977028504701, 0.6393024556394106, 0.6223866436257335, 0.5999232392636733, 0.5418403536642005, 0.4961461379219235, 0.4280278015788386, 0.35462315989740956, 0.2863017237662875, 0.2312185739351389, 0.18306363413831017]

listkT = np.arange(4.0,4.8,0.05)

print(Rsize[10])

plt.figure(figsize=(18, 10))
plt.title ('Binder cumulant for critical point')

plt.plot(listkT, Rsize[10], '-',label='Lattice sie 10')
plt.plot(listkT, Rsize[12], '-',label='Lattice sie 12')
plt.plot(listkT, Rsize[14], '-',label='Lattice sie 14')
plt.legend() 
plt.show()

curve_10=LineString(np.column_stack((listkT, Rsize[10])))
curve_12=LineString(np.column_stack((listkT, Rsize[12])))
curve_14=LineString(np.column_stack((listkT, Rsize[14])))

intersection12 = curve_10.intersection(curve_12)
intersection14 = curve_10.intersection(curve_14)

plt.plot(*LineString(intersection12).xy, 'o')
plt.plot(*LineString(intersection14).xy, 'o')

x12, y = LineString(intersection12).xy
x14, y = LineString(intersection14).xy
print(np.intersect1d(x12, x14))
print(x12,x14)

Но корректно генерирует ошибку AssertionError.


  File "C:\Users\Endeavour\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\Endeavour\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)
  File "E:/Project/Codes/3D.py", line 118, in <module>
    plt.plot(*LineString(intersection12).xy, 'o')

  File "C:\Users\Endeavour\Anaconda3\lib\site-packages\shapely\geometry\linestring.py", line 48, in __init__
    self._set_coords(coordinates)

  File "C:\Users\Endeavour\Anaconda3\lib\site-packages\shapely\geometry\linestring.py", line 97, in _set_coords
    ret = geos_linestring_from_py(coordinates)

  File "shapely/speedups/_speedups.pyx", line 87, in shapely.speedups._speedups.geos_linestring_from_py

AssertionError

Графики правильно отображаются с помощью matplotlib хоть. Я использую стройный впервые без какого-либо опыта в этом. Любая помощь будет высоко ценится. Спасибо. Примечание: конечная цель - пересечение 3 кривых. Если пересечение не найдено, точка, где они находятся ближе всего, достаточно хороша. Любое предложение или функция библиотеки, которые найдут это, будут очень полезны.

Заранее спасибо.

1 Ответ

0 голосов
/ 25 марта 2020

После ошибки подтверждения я проверил shapely/speedups/_speedups.pyx, строка 87 . Функция geos_linestring_from_py ожидает, что вы передадите либо LineString, либо LinearRing. Когда я печатаю ваши intersection12 и intersection14, я получаю:

POINT (4.503201814825258 0.4917840919384173)
POINT (4.51830999373466 0.4712012116887737)

Итак, вы передаете экземпляр Point для создания LineString, который создает ошибку AssertionError.

Помимо вашей ошибки, ваш подход также неверен, так как он предполагает, что (1) будет много пересечений между двумя кривыми, и (2) будет одна абсолютная точка, где пересекаются три кривые. Если вы увеличите масштаб своего графика, вы увидите, что это не так.

enter image description here

Красный круг соответствует вашему intersection12, а фиолетовый - это intersection14. Если вы ищете приблизительное решение, может быть, поиск среднего значения этих точек может помочь в этой ситуации, но для более сложных кривых с несколькими пересечениями на пару это также не рекомендуется.

...