Перейти к содержимому

Как передать массив в функцию python

  • автор:

Как передать массив в функцию в Python?

Массив — это объект, его можно передать в функцию как и любой другой объект (число, строку и т.д.) в качестве аргумента.

# можно передать напрямую print([1, 2, 3, 4]) # [1, 2, 3, 4] # можно после присваивания переменной fruits = ['apple', 'banana', 'orange'] print(fruits) # ['apple', 'banana', 'orange'] 

Документация

Передача массива ячеек как типа последовательности Python

В этом примере показано, как передать массив ячеек MATLAB ® функции Python ® .

Следующий модуль Python содержит функциональный theend , который добавляет текст в конец списка. Создайте текстовый файл, скопируйте этот модуль Python и сохраните файл как mymod.py в перезаписываемой папке, например, вашем prefdir папка.

# mymod.py """Python module demonstrates passing MATLAB types to Python functions""" def search(words): """Return list of words containing 'son'""" newlist = [w for w in words if 'son' in w] return newlist def theend(words): """Append 'The End' to list of words""" words.append('The End') return words

Добавьте папку, содержащую mymod.py к пути поиска файлов Python с помощью append метод list ввод.

P = py.sys.path; append(P,prefdir);

Откройте файл выборочных данных MATLAB, создав массив ячеек, LastName .

load patients.mat 

Преобразуйте массив ячеек в 1 — N py.list массив.

L = py.list(LastName'); class(L)
ans = py.list

Вызовите mymod.theend в списке.

py.mymod.theend(L);

Функция Python не делает возвращаемой переменной L как выходной аргумент. Вместо этого функция обновляет значение ссылкой.

Просмотрите последний элемент в списке.

ans = Python str with no properties. The End

Можно передать переменную L к другим функциям Python.

Похожие темы

  • Использование Типа списка Python в MATLAB
  • Передача данных Python
Документация MATLAB
Поддержка
  • MATLAB Answers
  • Помощь в установке
  • Отчеты об ошибках
  • Требования к продукту
  • Загрузка программного обеспечения

© 1994-2020 The MathWorks, Inc.

  • Условия использования
  • Патенты
  • Торговые марки
  • Список благодарностей

Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.

передача массива в функцию на питоне [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 4 года назад .

Как на питоне передать массив на выход в функцию? Делаю минимализацию по методу квайна, там очень полезно будет это использование.

Отслеживать
задан 5 окт 2019 в 5:35
Артём Подковыров Артём Подковыров
35 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Так же, как аргумент любого другого типа.
5 окт 2019 в 5:59

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Под массивом вы скорее всего имеете в виду list? Не совсем понятно в чем проблема его передачи в функцию:

def my_function(some_list): #code pass my_function([1, 2, 3, 4, 5]) 

Или предварительно записав его в переменную

my_list = [1, 2, 3, 4, 5] my_function(my_list) 

Отслеживать
ответ дан 5 окт 2019 в 8:04
Константин Комиссаров Константин Комиссаров
2,536 15 15 серебряных знаков 35 35 бронзовых знаков
invalid syntax же!
5 окт 2019 в 16:35
@andreymal где? почему?
5 окт 2019 в 16:37
Вы сами-то пробовали первый пример запустить?
5 окт 2019 в 16:38
@andreymal, а, все, тупанул, сейчас поправлю)
5 окт 2019 в 16:39

Да и второй пример тоже просто не работает, потому что локальная переменная my_list перекроет глобальную, и глобальный список будет недоступен внутри функции

5 окт 2019 в 16:40

  • python
  • массивы
  • функции
  • return
    Важное на Мете
Похожие

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » ctypes — как изменить в функции содержимое двумерного массива?

#1 Март 15, 2020 20:12:18

maksimio Зарегистрирован: 2020-03-15 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

Здравствуйте, возникла следующая проблема: я не могу понять, как правильно с помощью ctypes передать в C-функцию двумерный массив из python, размер которого задается во время выполнения python-скрипта. В функции требуется изменить элементы двумерного массива. Гугление помогло найти лишь передачу одномерного массива в функцию — это сработало. Но как реализовать мой случай я не понимаю.

Вот пример функции на C, которую требуется вызвать из кода на python. Она перед этим компилируется в динамическую библиотеку.

void changeArray(int arrayLen_1, int arrayLen_2, int **array)  for (int i = 0; i < arrayLen_1; i++) for (int j = 0; j < arrayLen_2; j++) array[i][j] = j+i; > 

#2 Март 15, 2020 22:32:04

doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

maksimio
void changeArray(int arrayLen_1, int arrayLen_2, int **array)

С такой сигнатурой это вовсе не двумерный массив. Передать то не проблема. Но изготовить такую штуку в питоне будет ой как непросто.

Приведите код на питоне которым вы собрались создавать этот “двумерный массив”.

#3 Март 16, 2020 00:15:08

maksimio Зарегистрирован: 2020-03-15 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

Двумерные массивы планировал создавать следующим образом:

a = 56 b = 4 array = [[0 for i in range(a)] for k in range(b)] 

Сейчас я решил свою проблему, сколхозив передачу нескольких одномерных массивов в C-функцию. Пока это сгодится, но мне желательно бы иметь возможность изменять произвольное количество массивов, а не 8, как в коде ниже.

Код на Python функции, которая собирает C-функцию с помощью ctypes:

def read_csi(csi_buf, nr, nc, num_tones): '''Расшифровывает csi из csi_buf, вызывая с помощью ctypes C-функцию''' if nr != 2 or nc != 2 or num_tones != 56: raise TypeError("Error: nr != 2 or nc != 2 or num_tones != 56") csi_re = [[0 for i in range(num_tones)] for k in range(nr * nc)] csi_im = [[0 for i in range(num_tones)] for k in range(nr * nc)] lib = ctypes.CDLL('./libextract_csi.so') lib.read_csi.restype = None lib.read_csi.argtypes = (ctypes.POINTER(ctypes.c_ubyte), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER( ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)) csi_buf = (ctypes.c_ubyte * len(csi_buf))(*csi_buf) for i in range(nr*nc): csi_re[i] = (ctypes.c_int * len(csi_re[i]))(*csi_re[i]) csi_im[i] = (ctypes.c_int * len(csi_im[i]))(*csi_im[i]) lib.read_csi(csi_buf, csi_re[0], csi_re[1], csi_re[2], csi_re[3], csi_im[0], csi_im[1], csi_im[2], csi_im[3]) csi_re[0], csi_re[1], csi_re[2], csi_re[3] = csi_re[0][:], csi_re[1][:], csi_re[2][:], csi_re[3][:] csi_im[0], csi_im[1], csi_im[2], csi_im[3] = csi_im[0][:], csi_im[1][:], csi_im[2][:], csi_im[3][:] return 're': csi_re, 'im': csi_im> 
void read_csi(unsigned char *local_h, int *re0, int *re1, int *re2, int *re3, int *im0, int *im1, int *im2, int *im3)

//здесь происходит изменение содержимого всех массивов re и im на основании данных из local_h
>

#4 Март 16, 2020 06:48:52

doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

maksimio
Сейчас я решил свою проблему

Очевидно вы ее не решили поскольку решение не соответствует требованиям первого поста.
В С не бывает двумерных массивов с переменными размерностями. Поэтому чисто формально передать туда такое нельзя.

Точнее непонятно в чем ваша проблема.
Это учебная задача? Нет -тогда нельзя менять интерфейс.
Вы хотите повысить быстродействие? Нет. Очевидно что все ваши манипуляции с массивами сожрут производительность. Тогда вы бы работали с данными лежащими в памяти подряд. Те нельзя работать со списками питона. Вместо них надо либо struct использовать либо что-то типа (ctypes.c_int*3)*5 либо numpy.array.
Вы делаете интерфейс к готовой системе? Нет. Сложность зашкаливает. В этом случае вы бы использовали boost python, pybind11, swig, cython или другие средства для этого предназначенные.

#5 Март 17, 2020 16:59:05

maksimio Зарегистрирован: 2020-03-15 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

Моя цель — повысить производительность. Время которое сожрут списки несущественно относительно времени, которое экономится, если C-функцию запускать с помощью ctypes (проверено профилировщиком). Я пробовал переписать эту функцию на python и не вызывать ее как dll — тогда код работает в 5 раз дольше.

Сейчас я просто хотел бы понять, каким образом я могу подать в C-функцию с помощью ctypes двумерный (а еще лучше многомерный) массив (т.е. массив указателей на указатели в C-функции). Я не знаю, с помощью какого типа данных в python это лучше сделать. У меня мало опыта, поэтому я был бы рад, если бы вы посоветовали что-то на этот счет. Либо я просто по прошествии некоторого времени смогу найти в интернете, как это можно сделать.

#6 Март 17, 2020 20:46:48

doza_and От: Зарегистрирован: 2010-08-15 Сообщения: 4138 Репутация: 252 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

maksimio
каким образом я могу подать в C-функцию с помощью ctypes двумерный (а еще лучше многомерный) массив (т.е. массив указателей на указатели в C-функции)

Вы наверное не очень хорошо знаете C. Поэтому я еще раз вам повторю. Двумерный массив и массив указателей на указатели это совершенно разные типы.

Для второго нормальных аналогов в питоне нет.

#7 Март 17, 2020 23:31:40

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9675 Репутация: 841 Профиль Отправить e-mail

ctypes — как изменить в функции содержимое двумерного массива?

maksimio
Моя цель — повысить производительность.

Напиши, какую программу делаешь. Неглубокое знание языка C и неглубокое знания языка Python вряд ли приведут к успеху. Так что, если у тебя и программа не сделана ещё, то заниматься повышением её производительности считается ошибкой, которая называется “преждевременная оптимизация”.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *