Python: Я получаю ошибку трансляции, но не знаю, как ее исправить. - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь адаптировать принятый код ответа по этой ссылке для моей цели: Нанесение стрелок градиента на карту тепла с помощью plt

Я работаю над проектом, который требует от менятепловое изображение в форме файла .csv, а затем взять данные из файла .csv для создания стрелок (через стримплот quiverplot и т. д.), которые показывают направление теплового потока от самой горячей точки (наибольшее значение пикселя) на изображении,Я думаю, что это может быть достигнуто с помощью градиента изображения, но я не уверен, как это реализовать.

Вот мой код:

import matplotlib.pyplot as plt
import numpy as np
import math

directory = os.chdir(r'user_directory') #Set folder to look in
file = 'data.csv'
data = np.genfromtxt(file, delimiter = ',')

horizontal_min, horizontal_max, horizontal_stepsize = 0, 100, 0.3
vertical_min, vertical_max, vertical_stepsize = 0, 100, 0.5

horizontal_dist = horizontal_max-horizontal_min
vertical_dist = vertical_max-vertical_min

horizontal_stepsize = horizontal_dist / float(math.ceil(horizontal_dist/float(horizontal_stepsize)))
vertical_stepsize = vertical_dist / float(math.ceil(vertical_dist/float(vertical_stepsize)))

xv, yv = np.meshgrid(np.arange(horizontal_min, horizontal_max, horizontal_stepsize),
                 np.arange(vertical_min, vertical_max, vertical_stepsize))
xv+=horizontal_stepsize/2.0
yv+=vertical_stepsize/2.0

result_matrix = np.asmatrix(data)
yd, xd = np.gradient(result_matrix)

def func_to_vectorize(x, y, dx, dy, scaling=0.01):
    plt.arrow(x, y, dx*scaling, dy*scaling), fc="k", ec="k", head_width=0.06, 
head_length=0.1)

vectorized_arrow_drawing = np.vectorize(func_to_vectorize)

plt.imshow(np.flip(result_matrix,0), extent=[horizontal_min, horizontal_max, vertical_min, 
vertical_max])
vectorized_arrow_drawing(xv, yv, xd, yd, 0.1)
plt.colorbar()
plt.show()

Это ошибка, которую я получаю:

ValueError: operands could not be broadcast together with shapes (200,335) (200,335) (100,100) (100,100) () </p> <p>EDIT: Traceback Error</p> <pre>ValueError Traceback (most recent call last) <ipython-input-95-25a8b7e2dff8> in <module> 46 47 plt.imshow(np.flip(result_matrix,0), extent=[horizontal_min, horizontal_max, vertical_min, vertical_max]) ---> 48 vectorized_arrow_drawing(xv, yv, xd, yd, 0.1) 49 plt.colorbar() 50 plt.show() ~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs) 1970 vargs.extend([kwargs[_n] for _n in names]) 1971 -> 1972 return self._vectorize_call(func=func, args=vargs) 1973 1974 def _get_ufunc_and_otypes(self, func, args): ~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args) 2046 for a in args] 2047 -> 2048 outputs = ufunc(*inputs) 2049 2050 if ufunc.nout == 1: ValueError: operands could not be broadcast together with shapes (100,168) (100,168) (100,100) (100,100) ()

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вам действительно нужно xd, yd, xv, yv, чтобы все имели одинаковую форму (или все транслировались в одну и ту же форму, но функционально это одно и то же), чтобы vectorize работал. Самый простой способ сделать это:

xv, yv = np.meshgrid(np.linspace(horizontal_min, horizontal_max, data.shape[0]),
                 np.linspace(vertical_min, vertical_max, data.shape[1]))

Альтернативой, если вам действительно нужно большее разрешение в одном направлении, чем в другом, является использование scipy.interpolate.interp2d для интерполяции xd и yd к измерениям xv и yv. Но это намного сложнее.

0 голосов
/ 02 октября 2019

Я предполагаю, что ошибка возникает из-за этой пары утверждений:

vectorized_arrow_drawing = np.vectorize(func_to_vectorize)
...
vectorized_arrow_drawing(xv, yv, xd, yd, 0.1)

Даже мое предположение верно, вы должны опубликовать больше сообщений об ошибках.

np.vectorizeиспользует broadcasting для объединения значений из входных данных и отправляет набор скалярных значений в func_to_vectorize для каждой комбинации.

В соответствии с ошибкой, 5 аргументов имеют форму:

(200,335) (200,335) (100,100) (100,100) ()

Массив () является скалярным значением 0,1. Это должно быть хорошо. Но он не может использовать массивы (200,335) вместе с (100,100). Массивы xv и yv несовместимы с массивами xd и yd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...