Неизвестный синтаксис в скрипте Python вызывает ошибку индекса. Можешь прочитать это? (и объясни это?) - PullRequest
0 голосов
/ 18 июня 2020

Я нашел старый сценарий python, который не работает ни в Python3, ни в Python2. Однако это должен быть действующий функциональный код.

Он генерирует некоторые 3d-координаты и помещает их в массив. Позже он записывает массив в файл. Здесь возникает ошибка.

Массив, содержащий данные в следующей форме:

(Pdb) vertices
array([[ 0.00000000e+00,  3.74741921e-15,  6.50000000e+01],
       [ 0.00000000e+00,  3.85844844e-15,  6.30132450e+01],
       [ 1.87370960e-15,  3.24536023e-15,  6.50000000e+01],
       [ 1.93591517e-15,  3.35310344e-15,  6.32317881e+01]])

Фрагмент кода:

# Create the mesh
obj = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        obj.vectors[i][j] = vertices[f[j],:]

Ошибка:

IndexError: допустимыми индексами являются только целые числа, срезы (:), многоточие (...), numpy .newaxis (None) и целочисленные или логические массивы

Поскольку я новичок в Python (я из PHP, C ++)), я действительно не могу прочитать / понять адресацию "vertices [f [j] ,:]". Я думал преобразовать его как INT, например «vertices [ int (f [j]),:]», это исправит, но тогда и геометрия тоже неисправна.

Кто-нибудь может объяснить Мне эта часть индексной адресации?

ОБНОВЛЕНИЕ: Да, Faces - это еще один массив вершин из трех кортежей.

(Pdb) p(f)
array([ 0., 26.,  2.])
(Pdb) p(j)
0

Хмм. Означает ли утверждение «вершины [f [j] ,:]» взять первое и второе значение и игнорировать третье ?? Мне все еще интересно, что коды работают в прошлом.

1 Ответ

0 голосов
/ 18 июня 2020

Более старые версии numpy принимали числа с плавающей запятой в качестве индексов массивов. Это было изменено в numpy 1.12 , выпущенном в 2017 году. Теперь вам нужно указать целые числа.

с

f = np.array([ 0., 26.,  2.])

и vertices 2-D Иногда код следует изменить на vertices[int(f[j]), :], чтобы выбрать номер строки f [j]. Лучше, если инициализируется faces, преобразовать весь массив в int, например faces = np.array(..., dtype=int) (заменить ... любыми данными).

Вы заявляете: «Геометрия также неисправна. . ". Я не знаю, что вы имеете в виду, но я уверен, что это связано с не связанной проблемой.

Вы можете попробовать запустить это в более старой среде. Я не знаю, какая у вас ОС; на Windows вы можете легко запустить старую версию Win python без ущерба для вашей текущей установки. В Linux вы можете установить более старый дистрибутив Anaconda (не пробуйте это в Windows, если вы не очень хорошо знакомы с управлением средами Anaconda).

Если вы хотите знать, является ли это python2 или python3: код python2 может быть распознан, если встречается одно из следующих: import exceptions, print 'without parentheses', for i in xrange(n).

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