Как использовать сигнал интерфейса для итерации по матрице numpy?

#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)