Объект 'numpy.ndarray' не может быть вызван - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий фрагмент кода.

fw = open(os.path.join(result_folder, 'motor_commands.txt'),'w')

np.set_printoptions(precision=3)

for positioner in positioner_grid.positioners[1:]:
    simplejson.dump(('Positioner ' + str(positioner.ident)), fw)
    fw.write('\n')
    array = np.array(positioner.motor1.position_array) * 180/math.pi
    array = np.round(array, decimals=4)
    simplejson.dump(array.tolist(), fw)
    fw.write('\n')
    array = np.array(positioner.motor2.position_array) * 180/math.pi
    array = np.round(array, decimals=4)
    simplejson.dump(array.tolist(), fw)
    fw.write('\n \n')
fw.close()

Его выводом является motor_commands.txt, чья компоновка (например, для 2 позиционеров) выглядит следующим образом (следующие символические записи являются действительными числами):

"Positioner 1"
[P11, P12, P13]
[Q11, Q12, Q13]

"Positioner 2"
[P21, P22, P23]
[Q21, Q22, Q23]

Учитывая заданную переменную dt, мне нужно сгенерировать другой файл с именем trajectories.yaml, формат которого должен быть таким:

1:
    alpha: [[P11,0*dt],[P12,1*dt],[P13,2*dt]]
    beta:  [[Q11,0*dt],[Q12,1*dt],[Q13,2*dt]]
2:
    alpha: [[P21,0*dt],[P22,1*dt],[P23,2*dt]]
    beta:  [[Q21,0*dt],[Q22,1*dt],[Q23,2*dt]]

Итак, здесьэто то, что я до сих пор пытался сгенерировать макет выше.

    tw = open(os.path.join(result_folder, 'trajectories.yaml'), 'w')

    for positioner in positioner_grid.positioners[1:]:
        simplejson.dump((str(positioner.ident) + ':'), tw)
        tw.write('\n')
        simplejson.dump(('alpha: '), tw)
        position1 = []
        for i in range(1, len(positioner.motor1.position_array)):
            temp = [positioner.motor1.position_array[i] * 180 / math.pi, (i-1) * dt]
            position1.append(temp)
        simplejson.dump(array[position1].tolist(), tw)
        tw.write('\n')
        simplejson.dump(('beta: '), tw)
        position2 = []
        for i in range(1, len(positioner.motor2.position_array)):
            temp = [positioner.motor2.position_array[i] * 180 / math.pi, (i-1) * dt]
            position2.append(temp)
        simplejson.dump(array[position2].tolist(), tw)
        tw.write('\n')
    tw.close()

Но выдается следующая ошибка:

'numpy.ndarray' object is not callable Files are not properly selected.

и мой trajectories.yaml файл не генерируется правильно:

"1:"
"alpha: "

Что я делаю не так, пожалуйста?

1 Ответ

0 голосов
/ 20 декабря 2018

Трудно быть уверенным, но я верю, что ваша проблема будет решена следующим образом.

tw = open(os.path.join(result_folder, 'trajectories.yaml'), 'w')

for positioner in positioner_grid.positioners[1:]:
    tw.write(str(positioner.ident) + ':')
    tw.write('\n')
    tw.write('    alpha: ')
    position1 = []
    for i in range(0, len(positioner.motor1.position_array)):
        temp = [positioner.motor1.position_array[i] * 180 / math.pi, i * dt]
        position1.append(temp)
    simplejson.dump(position1, tw)
    tw.write('\n')
    tw.write('    beta: ')
    position2 = []
    for i in range(0, len(positioner.motor2.position_array)):
        temp = [positioner.motor2.position_array[i] * 180 / math.pi, i * dt]
        position2.append(temp)
    simplejson.dump(position2, tw)
    tw.write('\n')
tw.close()

Этот код может быть значительно сокращен, если мы используем math.degrees(), enumerate() и составим список,Более того, предпочтительным языком для open() является with open(...):, который гарантирует, что файл будет закрыт.

Имея это в виду, вышеприведенное можно переписать как:

import math

with open(os.path.join(result_folder, 'trajectories.yaml'), 'w') as tw:
    for p in positioner_grid.positioners[1:]:
        tw.write(str(p.ident) + ':\n    alpha: ')
        position1 = [[math.degrees(pos), i * dt] for i, pos in enumerate(p.motor1.position_array)]
        simplejson.dump(position1, tw)
        tw.write('\n    beta: ')
        position2 = [[math.degrees(pos), i * dt] for i, pos in enumerate(p.motor2.position_array)]
        simplejson.dump(position2, tw)
        tw.write('\n')
...