2016-10-12 2 views
0

Хорошо, так у меня есть таблица ху координаты для связки различных точек, например так:Looping через таблицу для расчета разделений - Python

ID  X   Y 
    1 403.294 111.401 
    2 1771.424  62.183 
    3 804.812  71.674 
    4 2066.54  43.456 
    5 2208.55  40.907 

Каждая строка представляет объект с его ID, X и Y указаны , На самом деле моя таблица содержит около 1345 строк. То, что я пытаюсь сделать, это цикл каждой строки и вычисление разделения этого объекта из всех других объектов в таблице, которые я в конечном итоге использую для создания гистограммы. То, что у меня есть до сих пор:

sep_dat = np.zeros(shape=(5,5))    #create array for writing into 
dat = np.loadtxt('SEA_mini_test.tab')   #table of data 
IDs = dat[:,0] 
X_dat = dat[:,1] 
X_dat = np.sort(X_dat) 
Y_dat = dat[:,2] 
Y_dat = np.sort(Y_dat) 
for i, x, y in zip(xrange(len(X_dat)), X_dat, Y_dat): 
    sep_dat[i] = math.sqrt((x-X_dat)**2+(y-Y_dat)**2) 
    np.savetxt('SEA_mini_seps.dat', sep_dat, fmt='%10.9f') 

Но мне еще нужно, чтобы он успешно работал. Последней ошибкой я получил:

TypeError: only length-1 arrays can be converted to Python scalars

Итак, как я могу заставить это работать правильно?

И как я могу заставить его игнорировать себя при выполнении расчетов? Как и для объекта 1 (строка 1), я не хочу, чтобы он вычислял выделение от себя. Я попытался добавить идентификаторы в zip и добавить оператор if внутри цикла for до вычисления, например if id != id:, но это не сработает. Кто-нибудь имеет представление о том, как я могу это сделать?

И еще один вопрос, который у меня был, как я мог записать все данные в сплющенный массив? Прямо сейчас я создал пустой массив нулей, которые я записываю с вычисленными значениями, но в конце получаю массив (5,5). Но я хочу (5,1), чтобы я мог построить его как гистограмму. Есть идеи?

+0

почему вы сортировки х и у по отдельности? Как вы определяете разделение - расстояние от центра масс? –

+0

Что ты имеешь в виду? Разделение является просто sqrt (dx^2 + dy^2). Я просто пытаюсь вычислить физическое разделение одного объекта на все другие объекты. – Courtney

ответ

1

Ошибка возникает из-за того, что math.sqrt() может принимать только значение float, если вы передадите np.array, он попытается преобразовать в float. Это работает только в том случае, если массив содержит одно значение.

> math.sqrt(np.array([2])) 
1.4142135623730951 

> math.sqrt(np.array([2,1])) Traceback (most recent call last): 

    File "<ipython-input-49-f9a9c77bfbdf>", line 1, in <module> 
    math.sqrt(np.array([2,1])) 

TypeError: only length-1 arrays can be converted to Python scalars 

Вы можете использовать np.sqrt(), который вернет массив квадратных корней.

> x = np.arange(1,5)  #[1,2,3,4] 
> y = x[::-1]   #[4,3,2,1] 
> z = x**2 + y**2  #[1*1+4*4,...,4*4+1*1] 
> np.sqrt(z) 
array([ 4.12310563, 3.60555128, 3.60555128, 4.12310563]) 

Если это желаемое поведение

+0

Итак, как я могу вычислить квадратный корень без использования математики? – Courtney

+0

Хорошо, я получил это на работу. Спасибо! – Courtney

Смежные вопросы