Complex arrays
Логическая структура массивов в стиле NumPy определяется itemsize , ndim , shape и strides .
Если ndim == 0 , ячейка памяти, на которую указывает buf , интерпретируется как скаляр размера itemsize . В этом случае и shape , и strides равны NULL .
Если strides равно NULL , массив интерпретируется как стандартный n-мерный C-массив. В противном случае потребитель должен получить доступ к n-мерному массиву следующим образом:
ptr = (char *)buf + indices[0] * strides[0] + . + indices[n-1] * strides[n-1]; item = *((typeof(item) *)ptr);
Как отмечалось выше, buf может указывать на любое место в реальном блоке памяти. Экспортер может проверить действительность буфера с помощью этой функции:
def verify_structure(memlen, itemsize, ndim, shape, strides, offset): """Verify that the parameters represent a valid array within the bounds of the allocated memory: char *mem: start of the physical memory block memlen: length of the physical memory block offset: (char *)buf - mem """ if offset % itemsize: return False if offset < 0 or offset+itemsize > memlen: return False if any(v % itemsize for v in strides): return False if ndim 0: return ndim == 0 and not shape and not strides if 0 in shape: return True imin = sum(strides[j]*(shape[j]-1) for j in range(ndim) if strides[j] 0) imax = sum(strides[j]*(shape[j]-1) for j in range(ndim) if strides[j] > 0) return 0 and offset+imax+itemsizePIL-стиль:форма,стриды и подмножества
В дополнение к обычным элементам массивы в стиле PIL могут содержать указатели, которым необходимо следовать, чтобы перейти к следующему элементу в измерении. Например, обычный трехмерный C-массив char v[2][2][3] также можно рассматривать как массив из 2 указателей на 2 двумерных массива: char (*v[2])[2][3] . В представлении подсмещений эти два указателя могут быть встроены в начало buf , указывая на два массива char x[2][3] , которые могут располагаться в любом месте памяти.
Вот функция, которая возвращает указатель на элемент в массиве ND, на который указывает N-мерный индекс, когда есть как ненулевые шаги, так и NULL :
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides, Py_ssize_t *suboffsets, Py_ssize_t *indices) < char *pointer = (char*)buf; int i; for (i = 0; i < ndim; i++) < pointer += strides[i] * indices[i]; if (suboffsets[i] >=0 ) < pointer = *((char**)pointer) + suboffsets[i]; > > return (void*)pointer; >Buffer-related functions
Возвращает 1 , если obj поддерживает интерфейс буфера, в противном случае 0 . Когда возвращается 1 , это не гарантирует, что PyObject_GetBuffer() будет успешным. Эта функция всегда выполняется успешно.
int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags) Часть стабильного ABI начиная с версии 3.11.
Отправьте экспортеру запрос на заполнение представления в соответствии с флагами . Если экспортер не может предоставить буфер точного типа, он ДОЛЖЕН вызвать PyExc_BufferError , установить view->obj в NULL и вернуть -1 .
В случае успеха заполните view , установите view->obj в новую ссылку на экспортер и верните 0. В случае поставщиков цепочек буферов, которые перенаправляют запросы к одному объекту, view->obj МОЖЕТ ссылаться на этот объект вместо экспортера ( См . Структуры объектов буфера ).
Успешные вызовы PyObject_GetBuffer() должны сопровождаться вызовами PyBuffer_Release() , аналогично malloc() и free() . Таким образом, после того, как потребитель закончит работу с буфером, PyBuffer_Release() должен быть вызван ровно один раз.
void PyBuffer_Release(Py_buffer *view) Часть стабильного ABI начиная с версии 3.11.
Освободите представление буфера и уменьшите счетчик ссылок для view->obj . Эта функция ДОЛЖНА вызываться, когда буфер больше не используется, иначе могут возникнуть утечки ссылок.
Вызов этой функции для буфера, который не был получен с помощью PyObject_GetBuffer() , является ошибкой .
Py_ssize_t PyBuffer_SizeFromFormat(const char *format) Часть стабильного ABI начиная с версии 3.11.
Возвращает подразумеваемый itemsize из format . В случае ошибки создать исключение и вернуть -1.
int PyBuffer_IsContiguous(const Py_buffer *view, char order) Часть стабильного ABI начиная с версии 3.11.
Вернуть 1 , если память, определенная представлением , является непрерывной в стиле C ( порядок равен 'C' ) или стилю Fortran ( порядок равен 'F' ) , или любой из них ( порядок равен 'A' ). В противном случае вернуть 0 . Эта функция всегда выполняется успешно.
void *PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices) Часть стабильного ABI начиная с версии 3.11.
Получить область памяти, на которую указывают индексы внутри данного представления . indexs должен указывать на массив индексов view->ndim .
int PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort) Часть стабильного ABI начиная с версии 3.11.
Скопируйте непрерывные байты len из buf в представление . fort может быть 'C' или 'F' (для упорядочения в стиле C или Fortran). 0 возвращается в случае успеха, -1 в случае ошибки.
int PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char order) Часть стабильного ABI начиная с версии 3.11.
Скопируйте len байтов из src в его непрерывное представление в buf . порядок может быть 'C' или 'F' или 'A' (для упорядочения в стиле C или Fortran или любой из них). 0 возвращается в случае успеха, -1 в случае ошибки.
Эта функция не работает, если len != src->len .
int PyObject_CopyData(Py_buffer *dest, Py_buffer *src) Часть стабильного ABI начиная с версии 3.11.
Скопируйте данные из src в буфер назначения . Может конвертировать между буферами в стиле C и/или в стиле Fortran.
0 возвращается в случае успеха, -1 в случае ошибки.
void PyBuffer_FillContiguousStrides(int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order) Часть стабильного ABI начиная с версии 3.11.
Заполните массив шагов байтовыми шагами непрерывного ( в стиле C, если порядок равен 'C' или в стиле Fortran, если порядок равен 'F' ) массива заданной формы с заданным количеством байтов на элемент.
int PyBuffer_FillInfo(Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags) Часть стабильного ABI начиная с версии 3.11.
Обрабатывать запросы буфера для экспортера, который хочет выставить buf размера len с возможностью записи, установленной в соответствии с readonly . buf интерпретируется как последовательность байтов без знака.
Аргумент flags указывает тип запроса. Эта функция всегда заполняет представление , как указано флагами, если только buf не был назначен только для чтения, а PyBUF_WRITABLE не установлен в flags .
В случае успеха установите view->obj в новую ссылку на экспортер и верните 0. В противном случае PyExc_BufferError , установите view->obj в NULL и верните -1 ;
Если эта функция используется как часть getbufferproc , экспортер ДОЛЖЕН быть установлен на экспортирующий объект, а флаги должны передаваться без изменений. В противном случае экспортер ДОЛЖЕН иметь NULL .
Python 3.11
Этот подтип PyObject представляет байтовый массив Python Этот экземпляр PyTypeObject представляет байтовый массив Python,такой же,как слой.
Эти функции вызывают ошибку TypeError,если ожидают параметр bytes и вызываются с параметром не bytes Этот подтип PyObject представляет экземпляр Python bytes This
Массив комплексных чисел в Python
У Python есть как собственный список, так и собственный сложный тип, поэтому:
делает трюк создания одного;
complexes = [ complex(i, i) for i in range(100) ]
создает тысячи комплексных значений в списке комплексов.
Возможно, вы захотите взглянуть на Nu mPy:
import numpy arr = numpy.ndarray(1000, dtype=numpy.complex128)
Python имеет встроенную поддержку комплексных чисел. Вы можете просто ввести их так:
>>> a = 2 + 3j # or: complex(2,3) >>> a (2+3j) >>> type(a) >>> a.real 2.0 >>> a.imag 3.0 >>>
Что касается контейнера, в Python вы можете начать со списка:
>>> complex_nums_list = [2+3j, 3+4j, 4+5j] >>> complex_nums_list [(2+3j), (3+4j), (4+5j)]
Или вы можете использовать numpy.array, который больше подходит для числовых приложений.
Вы просто создаете список значений:
array_size = 10 vec = [complex()] * array_size
Это создаст список из 10 пустых комплексных чисел.
Затем вы можете установить первый и второй элементы, если хотите,
vec[0] = complex(2. , 2.,) # complex number 2+2j vec[1] = 2 + 2j
или добавьте новый элемент в свой список:
Вы можете использовать встроенный комплексный класс.
Или просто используйте сложный литерал: Python использует j для мнимой единицы.
z = complex(3, 4) print(z, z.real, z.imag) z = 3 + 4j print(z)
Сложный конструктор также принимает ключевые аргументы, так что вы можете сделать
с аргументами в любом порядке. И это также означает, что вы можете даже передать аргументы в dict , если ты хочешь:
Также имеется встроенный модуль cmath для математических функций сложных аргументов.
На самом деле, я хочу отсортировать сложные числа по их модулю. Это моя очередь.
import math class Complex: def __init__( self, a, b ): self.a = a self.b = b def getModule( self ): return math.sqrt( self.a**2 + self.b**2 ) def __str__( self ): ''' Returns complex number as a string ''' return '(%s + i %s)' % (self.a, self.b) def add(self, x, y): return Complex(self.a + x, self.b + y) def sub(self, x, y): return Complex(self.a - x, self.b - y) #input = [[2, 7],[5, 4],[9, 2],[9, 3],[7, 8], [2, 2], [1, 1]] # Read the input from a given file complex.in, # in fact is a matrix with Nx2 dimensions # first line re1 im1 # second line re2 im2 # . #Example complex.in #5 #2 7 #5 4 #9 2 #9 3 #7 8 f = open('complex.in','r') input = [map(int, line.split(' ')) for line in f] del input[0] num = len( input ) complexes = [ Complex( i[ 0 ], i[ 1 ] ) for i in input ] def swapp(c, a, b): c[ a ], c[ b ] = c[ b ], c[ a ] def sort( c ): swapped = 1 for i in range(num - 1, 0, -1): swapped = 1 for j in range(0, i): if c[ j ].getModule() > c[ j + 1 ].getModule(): swapped = 0 swapp(c, j, j + 1) if swapped: break sort( complexes ) f = open('complex.out','w') for c in complexes: f.write('%s\n' % c) print c