Вы вызываете функцию-конструктора numpy
ndarray()
со списком, содержащим 1000 чисел - ваши вручную рассчитанные средние значения каждого из 1000 измерений.
Функция ndarray()
ожидает, что ее аргумент будет shape построенной матрицы, поэтому она пытается создать новую матрицу формы (d[0], d[1], ..., d[999])
- и затем каждое отдельное значение внутри этогоматрица будет адресована с набором 1000-int координат. И действительно, массивы numpy
могут иметь только 32 независимых измерения.
Но даже если вы сократите список, который вы предоставляете, до ndarray()
до 32 чисел, у вас все равно будет проблема, потому что ваши 32 числа являются значениями с плавающей запятой, а ndarray()
ожидаетинтегральные числа. (Вы получите TypeError
.)
В рамках подхода, который вы пытаетесь использовать - который не совсем оптимален, как мы покажем ниже - вы действительно хотите создать один вектор из 1000 измерений с плавающей точкой. То есть 1000 клеточных значений - не d[0] * d[1] * ... * d[999]
отдельных клеточных значений.
Таким образом, грубое исправление в соответствии с первоначальным подходом могло бы заменить вашу последнюю строку на:
result = np.ndarray(len(d))
for i in range(len(d)):
result[i] = d[i]
Но есть много способов постепенно сделать это более эффективным, компактным иидиоматический - число, о котором я упомяну ниже, хотя подход best , снизу, делает большинство этих промежуточных шагов ненужными.
Для одного вместо этого цикла назначенияв моем коде чуть выше, вы можете использовать опцию присваивания скобками индексации Python:
result = np.ndarray(len(d))
result[:] = d # same result as previous 3-lines w/ loop
Но на самом деле, функция numpy
*1034* может, по сути, создать необходимую numpy
-нарожденную ndarray
из данного списка, поэтому вместо использования ndarray()
вы можете просто использовать array()
:
result = np.array(d) # same result as previous 2-lines
Но, кроме того, многие функции numpy
для работы с массивами (исписки, подобные массиву), уже включают в себя действия, позволяющие выполнять усреднение многих векторов за один шаг (где даже циклы скрыты внутри очень эффективного скомпилированного кода или операций объемного вектора ЦП). Например, есть функция mean()
, которая может усреднять списки чисел, или многомерные массивы чисел, или выровненные наборы векторов и т. Д.
Это позволяет быстрее, более четкие, однострочные подходыкоторый может заменить весь ваш исходный код на что-то вроде:
# get a list of available word-vetors
doc = [model[word] for word in text if word in model.vocab]
# average all those vectors
out = np.mean(doc, axis=0)
(без аргумента axis
он усреднит все отдельные значения измерения во всех слотах в одно единственное окончательное среднее число.)