Отладка ошибки типа NumPy?[отредактировано из предыдущего ValueError] - PullRequest
0 голосов
/ 02 июля 2019

Я писал код ниже и получал ошибку:

TypeError: в скаляры Python могут быть преобразованы только массивы размера 1

Проблема в «оператор if и переменная agrmnt» , но не знаю почему, потому что переменная «agrmnt» имеет тип int.Я не уверен, почему я не могу использовать условное утверждение здесь.

import numpy as np

feature_matrix= np.array([[ 0.1837462,  0.29989789, -0.35889786, -0.30780561, -0.44230703, -0.03043835,
   0.21370063,  0.33344998, -0.40850817, -0.13105809],
 [ 0.08254096,  0.06012654,  0.19821234,  0.40958367,  0.07155838, -0.49830717,
   0.09098162,  0.19062183, -0.27312663,  0.39060785],
 [-0.20112519, -0.00593087,  0.05738862,  0.16811148, -0.10466314, -0.21348009,
   0.45806193, -0.27659307,  0.2901038,  -0.29736505],
 [-0.14703536, -0.45573697, -0.47563745, -0.08546162, -0.08562345,  0.07636098,
  -0.42087389, -0.16322197, -0.02759763,  0.0297091 ],
 [-0.18082261,  0.28644149, -0.47549449, -0.3049562,   0.13967768,  0.34904474,
   0.20627692,  0.28407868,  0.21849356, -0.01642202]])
labels = np.array([-1, -1, -1,  1, -1])
T= 10
L= 0.1456692551041303

    tta = np.zeros((feature_matrix[0].size)).reshape(-1,1)
    tta_0 = 0
    for t in range(T):
        for i in range(feature_matrix.shape[0]):
            agrmnt = np.asscalar(labels[i]*(int(np.dot(feature_matrix[i][np.newaxis], tta)) + tta_0))
            if agrmnt<=1:
                tta = (1-(L*1/((t+1)**0.5))*tta)+(1/((t+1)**0.5)* 
                         (labels[i]*feature_matrix[i][np.newaxis])))
                tta_0 = tta_0 + (labels[i]*1/((t+1)**0.5))
            else:
                tta = (1-(L*((t+1)**0.5))*tta[np.newaxis].T)
                tta_0 = tta_0

    print(tta,tta_0)

Может кто-нибудь проверить почему и указать мне правильное направление?

1 Ответ

0 голосов
/ 02 июля 2019

скопируйте и вставьте ваш код и исправьте одну синтаксическую ошибку:

1256:~/mypy$ python3 stack56844635.py 
Traceback (most recent call last):
  File "stack56844635.py", line 21, in <module>
    agrmnt = np.asscalar(labels[i]*(int(np.dot(feature_matrix[i][np.newaxis], tta)) + tta_0))
TypeError: only size-1 arrays can be converted to Python scalars

Очевидно, что ошибка находится в строке asscalar.

, изменив код на:

    temp = labels[i]*(int(np.dot(feature_matrix[i][np.newaxis], tta)) + tta_0)
    print(temp)
    agrmnt = np.asscalar(temp)

Я получаю

1259:~/mypy$ python3 stack56844635.py 
0
Traceback (most recent call last):
  File "stack56844635.py", line 21, in <module>
    temp = labels[i]*(int(np.dot(feature_matrix[i][np.newaxis], tta)) + tta_0)
TypeError: only size-1 arrays can be converted to Python scalars

Так что, очевидно, он выполнялся на итерации очень хорошо, создавая значение 0;но следующий цикл вызывает ошибку.Но, посмотрев более внимательно на эту строку, я вижу int().Это приведет к той же ошибке.

Уберите это:

    temp = labels[i]*(np.dot(feature_matrix[i][np.newaxis], tta) + tta_0)
    print(temp)
    agrmnt = np.asscalar(temp)

1300:~/mypy$ python3 stack56844635.py 
[[-0.]]
[[ 0.41001225  0.49396662  0.01778946  0.0547189  -0.04249864  0.25519979
   0.4316633   0.51821805 -0.01806885  0.1824719 ]]
Traceback (most recent call last):
  File "stack56844635.py", line 23, in <module>
    agrmnt = np.asscalar(temp)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/type_check.py", line 547, in asscalar
    return a.item()
ValueError: can only convert an array of size 1 to a Python scalar

Теперь ошибка перемещается в ascalar (который использует .item()).

Впервая итерация temp - это массив (1,1) (что неудивительно для np.dot).Следующая итерация - массив (1,10).Это не может быть преобразовано в скаляр, с помощью int или asscalar.

Я указал местоположение ошибки и проблему.И предложили способы отладки.Но я не буду пытаться решить это за вас - вам нужно тщательно отслеживать размеры массива.Не пытайтесь обманывать вещи в оболочках в командах int и asscalar.

Первоначально tta - это массив (10,1), но после 1-го цикла это (10,10).

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