2015-04-05 4 views
1

У меня возникли некоторые проблемы с этим кодом, пытаясь в итоге получить внутренний продукт двух массивов с 1-D. Код интереса выглядит следующим образом:принимает значение «ValueError: установка элемента массива с последовательностью».

def find_percents(i): 
    percents=[] 
    median=1.5/(6+2*int(i/12)) 
    b=2*median 
    m=b/(7+2*int(i/12)) 
    for j in xrange (1,6+2*int(i/12)): 
     percents.append(float((b-m*j))) 
    percentlist=numpy.asarray(percents, dtype=float) 
    #print percentlist 
    total=sum(percentlist) 
    return total, percentlist 

def playerlister(i): 
    players=[] 
    for i in xrange(i+1,i+6+2*int(i/12)): 
     position=sheet.cell(i,2) 
     points=sheet.cell(i,24) 
     if re.findall('RB', str(position.value)): 
      vbd=points.value-rbs[24] 
      players.append(vbd) 
     else: 
      pass 
    playerlist=numpy.asarray(players, dtype=float) 
    return playerlist 

def others(i,percentlist,playerlist,total): 
    alternatives=[] 
    playerlist=playerlister(i) 
    percentlist=find_percents(i) 
    players=numpy.dot(playerlist,percentlist) 

Я получаю следующее сообщение об ошибке в ответ на самом последнюю строку этого прикрепленного кода:

ValueError: setting an array element with a sequence.

В большинстве других примеров этой ошибки, у меня есть обнаружена ошибка из-за неправильных типов данных в массивах percentlist и playerlist, но мой тип должен быть типа float. Если это помогает вообще, я называю эти функции чуть позже в программе, например, так:

for i in xrange(1,30): 
    total, percentlist= find_percents(i) 
    playerlist= playerlister(i) 
    print type(playerlist[i]) 
    draft_score= others(i,percentlist,playerlist,total) 

Может кто-нибудь помочь мне понять, почему я устанавливаю элемент массива с последовательностью? Пожалуйста, дайте мне знать, если какая-либо дополнительная информация может быть полезна! Также для ясности playerlister использует модуль xlrd для извлечения данных из электронной таблицы, но данные являются численными, и тестирование показало, что оба списка имеют тип numpy.float64.

Форма и содержание каждого из них в течение одной итерации является i

<type 'numpy.float64'> 
(5,) 
[ 73.7 -94.4 140.9 44.8 130.9] 
(5,) 
[ 0.42857143 0.35714286 0.28571429 0.21428571 0.14285714] 

ответ

1

Ваша функция возвращает find_percents два элемента кортежа. Когда вы вызываете его в others, вы привязываете этот кортеж к переменной с именем percentlist, которую затем пытаетесь использовать в dot-продукте.

Я думаю, что пишу это в others она фиксируется:

def others(i,percentlist,playerlist,total): 
    playerlist = playerlister(i) 
    _, percentlist = find_percents(i) 
    players = numpy.dot(playerlist,percentlist) 

при условии, конечно playerlist и percentlist всегда имеют одинаковое число элементов (которые мы не можем проверить из-за отсутствующей таблицы) ,

Чтобы проверить следующее дает точное сообщение об ошибке и минимум кода, необходимого для его воспроизвести:

>>> import numpy as np 
>>> a = np.arange(5) 
>>> np.dot(a, (2, a)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: setting an array element with a sequence.