Ошибка Python при создании матриц - PullRequest
3 голосов
/ 22 мая 2011

Я написал код на Python для создания матрицы вероятности перехода из данных, но я продолжаю получать неправильные значения для двух конкретных точек данных. Я потратил несколько дней, пытаясь выяснить проблему, но безуспешно.

О коде: ввод 4 столбцов в CSV-файл. После подготовки данных первые два столбца - это новые и старые значения состояния. Мне нужно рассчитать, как часто каждое старое значение состояния переходит в новое (в основном, как часто каждая пара (x, y) встречается в первых двух столбцах данных). Значения в этих столбцах находятся в диапазоне от 0 до 99. В матрице trans_pr я хочу получить число, как часто пара (x, y) встречается в данных, и иметь это число в соответствующих координатах (x, y) в trans_pr. матрица. Поскольку значения находятся в диапазоне от 0 до 99, я могу просто добавить 1 к матрице в этих координатах каждый раз, когда они встречаются в данных.

Проблема: код работает нормально, но я всегда получаю нули в координатах (:, 29) и (:, 58) и (29, :) и (58; :), несмотря на наличие наблюдений там. Иногда кажется, что число с этими координатами добавляется к предыдущей строке. Опять же, не имеет никакого смысла для меня.

Буду очень признателен, если кто-нибудь сможет помочь. (Я новичок в Python, поэтому код, вероятно, неэффективен, но важна только ошибка.)

Код настолько прост, насколько может быть:

from numpy import *
import csv

my_data = genfromtxt('99c_test.csv', delimiter=',')

"""prepares data for further calculations"""
my_data1=zeros((len(my_data),4))
my_data1[1:,0]=100*my_data[1:,0]
my_data1[1:,1]=100*my_data[1:,3]
my_data1[1:,2]=my_data[1:,1]
my_data1[1:,3]=my_data[1:,2]
my_data2=my_data1
trans_pr=zeros((101,101))
print my_data2

"""fills the matrix with frequencies of observations"""

for i in range(len(my_data2)):
    trans_pr[my_data2[i,1],my_data2[i,0]]=trans_pr[my_data2[i,1],my_data2[i,0]]+1

c = csv.writer(open("trpr1.csv", "wb"))
c.writerows(trans_pr) 

Вы можете проверить код с помощью этого ввода (просто сохраните его как CSV-файл):

p_cent,p_euro,p_euro_old,p_cent_old
0.01,1,1,0.28
0.01,1,1,0.29
0.01,1,1,0.3
0.01,1,1,0.28
0.01,1,1,0.29
0.01,1,1,0.3
0.01,1,1,0.57
0.01,1,1,0.58
0.01,1,1,0.59
0.01,1,1,0.6

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

Вы можете найти rint() полезным, начиная с numpy.Округляет значение до ближайшего целого числа (см. numpy.rint() документ).Вы пробовали следующее:

for i in range(len(my_data2)):
    trans_pr[rint(my_data2[i,1]), rint(my_data2[i,0])] = \
         trans_pr[rint(my_data2[i,1]), rint(my_data2[i,0])] + 1
4 голосов
/ 22 мая 2011

Этот звук очень похож на проблему округления.Я бы предположил, что, например, 100 * 0,29 (как число с плавающей запятой) округляется в меньшую сторону (т.е. усекается) и, таким образом, дает 28 вместо 29. Попробуйте округлить числа самостоятельно (т.е. округление вверх / вниз), прежде чем использовать их в качествеиндекс массива.

Обновление: Проверив мою гипотезу, проверив ее, даже числа соответствуют описанным выше - см. здесь .

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