#python #numpy #pygears
#питон #numpy #пигеры #python #pygears
Вопрос:
У меня проблемы с итерацией по матрице numpy с использованием сигнала интерфейса. Я попытался вручную привести «addr», но это не сработало. Это мой код:
@gear
async def ram_model_data_drv(addr: Uint[8],*,
data_type = b'dtype',
num_of_commands = 1) -> Queue['data_type']:
matrix = np.random.randint(10, size = (num_of_commands, 10))
async with addr:
for data, last in quiter(matrix[addr]):
yield (data, last)
И это сообщение об ошибке, которое я получаю.
Ошибка индекса: только целые числа, срезы (
:
), многоточие (...
), numpy.newaxis (None
) и целочисленные или логические массивы являются допустимыми индексами в модуле «/ram_model_drv»
Ответ №1:
Основная проблема здесь в том, что вы используете объект интерфейса ( addr
) для нарезки матрицы. Объекты интерфейса в PyGears передаются через позиционные аргументы (только addr
в вашем случае) функций и используются для связи между модулями. С другой стороны, аргументы только для ключевых слов ( data_type
и num_of_commands
в вашем случае) могут содержать любой объект, но обычно используются в качестве параметров времени компиляции.
В любом случае, хотя вы правильно использовали async with
инструкцию для получения данных из addr
интерфейса, вы должны были поместить полученные данные в новую переменную, подобную этой: async with addr as a
, которая должна читаться как: «Дождитесь, пока данные станут доступны в addr
интерфейсе, прочитайте их и сохраните в вызываемой переменной a
«.
Примечание стороны, вы использовали b'dtype'
в качестве значения для параметра data_type, но dtype
это не имя параметра и не имя шаблона типа, поэтому оно здесь избыточно. Я предполагаю, что вы хотели, чтобы пользователь модуля предоставил data_type
параметр в качестве выходного типа данных, поэтому вам следовало оставить его без значения по умолчанию.
from pygears import gear
from pygears.typing import Queue
import numpy as np
from pygears.util.utils import quiter
@gear
async def ram_model_data_drv(addr: Uint[8],
*,
data_type,
num_of_commands=1) -> Queue['data_type']:
matrix = np.random.randint(10, size=(num_of_commands, 10))
async with addr as a:
for data, last in quiter(matrix[a]):
yield (data, last)