Массивы в scipy (numpy), шпаргалка.
Решил перевести славную шпаргалку по массивам в scipy. Под катом
Оригинал находится по адресу http://pages.physics.cornell.edu/~myers/teaching/ComputationalMethods/python/arrays.html
Массивы это основный тип данных для пакета SciPy. (Точно такие же массивы доступны из пакета NumPy, который является подмножеством SciPy. Но для ясности мы будем говорить о массивах SciPy, хотя онлайн документация часто ссылается на массивы NumPy, что в принципе одно и то же. Технически массивы имеют тип ndarray, который расшифровывается как «n-размерный массив» (n-dimensional array)). Массивы становятся доступны после импорта модуля scipy: import scipy. В некотором роде массивы похожи на питноновские списки, но многомерные, содержащие данные одного типа и поддерживающие эффективные операции над собой. С недавних пор по SciPy и NumPy создается очень подробная документация.
Создание массивов
scipy.array(alist): создаёт n-мерный массив из списка (все элементы листа должны быть одинаково длинны)
- a = scipy.array([[1,2,3],[4,5,6]])
- b = scipy.array([i*i for i in range(100) if i%2==1])
- c = b.tolist() # конвертирует массив обратно в список
scipy.zeros(shape, dtype=float): создаёт n-мерный массив заданной формы, заполненный нулями заданного типа
- a = scipy.zeros(100) # 100 элементный массив нулей, тип float
- b = scipy.zeros((2,8), int) # массив нулей размера 2×8 типа int
- c = scipy.zeros((N,M,L), complex) # массив нулей NxMxL тип complex
scipy.ones(shape, dtype=float): создаёт n-мерный массив заданной формы, заполнены единицами заданного типа
- a = scipy.ones(10, int) # 10 элементный массив единиц типа int
- b = scipy.pi * scipy.ones((5,5)) # хороший способ заполнить массив заданным значением
scipy.eye(shape, dtype=float)
- id = scipy.eye(10,10) # 10×10 единичная матрица (единицы по диагонали)
- offdiag = scipy.eye(10,10,1)+scipy.eye(10,10,-1) # единицы по сдвинутой от центра диагонали
scipy.transpose(a) # транспонирует массив
- b = scipy.transpose(a) # заменяет строки на столбцы для двумерной матрицы (транспонирование), и заменяет оси друг на друга для размерностей больше 2х.
- b = a.T # эквивалентно scipy.transpose(a)
- c = scipy.swapaxes(a, axis1, axis2) # меняет местами заданные оси
scipy.arange and scipy.linspace
- a = scipy.arange(start, stop, increment) # похож на оператор range, но создаёт не список а массив
- b = scipy.linspace(start, stop, num_elements) # создаёт массив со значениями равномерно распределенными на num_elements интервалах между значениями start и stop
scipy.random создание случайного массива
- a = scipy.random.random((100,100)) # массив размера 100×100 содержащий значения типа float равномерно распределенные на интервале [0.,1.)
- b = scipy.random.randint(0,10, (100,)) # 100 значений формата int равномерно распределённых на интервале [0, 10), то есть не включающем верхней границы — 10
- c = scipy.random.standard_normal((5,5,5)) # стандартное нормальное распределение (среднее=0, стандартное отклонение =1) в массиве 5x5x5
?ндексирование массивов
Многомерное индексирование
- elem = a[i,j,k] # эквивалентно a[i][j][k] но вероятно более эффективно
«Отрицательное» индексирование (начинается с конца массива)
- last_elem = a[-1] # последний элемент массива
Массивы как индексы
- i = scipy.array([0,1,2,1]) # массив индексов для первой оси
- j = scipy.array([1,2,3,4]) # массив индексов для второй оси
- a[i,j] # возвращает массив ([a[0,1], a[1,2], a[2,3], a[1,4]])
- b = scipy.array([True, False, True, False])
- a[b] # возвращает массив ([a[0], a[2]]) поскольку только b[0] и b[2] являются True
Срезы массивов
Срез определенного подблока:
- section = a[10:20, 30:40] # 10×10 подблок начинающийся в [10,30]
Захватить все до начала/конца массва:
- asection = a[10:, 30:] # отсутствие завершающего индекса подразумевает «до конца массива»
- bsection = b[:10, :30] # отсутствие стартового индекска подразумевает «до начала массива»
Захватить всю колонку(ки)
- x = a[:, 0] # взять все значения из нулевой колонки (нет ни начала ни конца, то есть берем все строки)
- y = a[:, 1] # взять все значения из первой колонки (соответственно все строки)
Срезать хвост массива
- tail = a[-10:] # получить последние 10 элементов массива
- slab = b[:, -10:] # получить блок шириной 10 с «боку» массива
- interior = c[1:-1, 1:-1, 1:-1] # вырезать все кроме внешней «оболочки»
Поэлементные действия с массивами
Арифметические операции
- c = a + b # сложить a и b поэлиментно (массивы должны быть одной формы)
- d = e * f # перемножить e и f поэлементно (НЕ МАТР?ЧНОЕ УМНОЖЕН?Е)
- g = -h # меняет знак каждого элемента h
- y = (x+1)%2 # меняет местами нули и единицы в бинарном массиве x
- z = w > 0.0 # возвращает булев массив указывающий какие элементы > 0.0
- logspace = 10.**scipy.linspace(-6.0, -1.0, 50) # 50 равномерно распределенных точек между 1.e-06 и 1.0e-01
Тригонометрические операции
- y = scipy.sin(x) # синус каждого элемента x
- w = scipy.sin([i*i for i in range(100) if i%2==1]) # конвертация из списка в массив как часть функции
- z = scipy.exp((0.+1.j) * theta) # exp(i * theta) где i = sqrt(-1) = 0.+1.j
Суммирование массивов
Простое суммирование
- s = scipy.sum(a) # сумма всех элементов a, возвращает скаляр
- s0 = scipy.sum(a, axis=0) # сумма элементов вдоль определенной оси (=0), возвращает массив оставшейся формы, например,
- a = scipy.ones((10,20,30))
- s0 = scipy.sum(a, axis=0) # s0 имеет форму (20,30)
Осреднение и т. д.
- m = scipy.mean(a, axis) # вычисляет среднее вдоль определенной оси (если axis=None, осреднение происходит по всему массиву)
- s = scipy.std(a, axis) # вычисляет стандартное отклонение вдоль определенной оси (если axis=None, по всему массиву)
Накопительные суммы
- s0 = scipy.cumsum(a, axis=0) # накопительная сумма по оси 0, возвращает массив той же формы что и a
- s0 = scipy.cumsum(a) # накопительная сумма вдоль 0 оси, возвращает одномерный массив длинны shape[0]*shape[1]*…*shape[dim-1]
Другие полезные функции для работы с масиивами в SciPy
Много других полезных функций и методов с документацией находятся на странице NumPy Examples.
Многое из нижеперечисленного работает и как отдельные функции (scipy.blah(a)) и как методы массива (a.blah()).
- scipy.any(a): возвращает True если любой из элементов a является True
- scipy.all(a): возвращает True если все элементы a являются True
- scipy.alltrue(a, axis): применяет ЛОГ?ЧЕСКОЕ ? вдоль заданной оси a
- scipy.append(a, values, axis): добавляет значения к a вдоль заданной оси
- scipy.concatenate((a1, a2, …), axis): объединяет кортеж массивов вдоль определенной оси
- scipy.min(a, axis=None), scipy.max(a, axis=None): выдает min/max значения вдоль определенной оси (по всему массиву если axis=None)
- scipy.argmin(a, axis=None), scipy.argmax(a, axis=None): выдает индексы значений min/max массива a вдоль определенной оси (для всего массиваа если axis=None)
- scipy.reshape(a, newshape): изменяет форму массива (общее количество элементо массива должно сохраняться)
- scipy.matrix(a): создает матрицу из двухмерного массива a (в матрицах реализовано матричное умножение вместо поэлементного умножения)
- scipy.histogram, scipy.histogram2d, scipy.histogramdd: одномерная, двумаерная и d-мерная гистограмма соответственно
- scipy.around(a, decimals=0): округляет элементы массива до определенного количества знаков после запятой
- scipy.sign(a): возвращает массив такой же формы как a, с -1 где a < 0, 0 где a = 0, и +1 где a > 0
- a.tofile(fid, sep=»», format=»%s»): записывает a в определенный файл (fid), либо в бинарном либо в ascii формате в зависимости от опций
- scipy.fromfile(file=, dtype=float, count=-1, sep=»): считывает массив из файла (бинарного или ascii)
- scipy.unique(a): возвращает сортированные уникальные элементы a
- scipy.where(condition, x, y): возвращает массив той же формы что и condition, где значения из x вставлены в местах где condition является True, и значения из y где condition является False
- scipy.fliplr(a): перевернуть массив слева на право
- scipy.flipud(a): перевернуть массив сверху вниз
- a = a[:,:,:,::-1] — перевернуть одну из осей массива любой размерности
- numpy.unravel_index(flat_index, array.shape) — узнать координаты точки в многомерном массиве по flat index.
Хорошая шпаргалка. Новичкам в python и scipy будет полезно почитать, а знающим — только если напомнить основные полезные функции.
Весьма полезная информация!
Считываю из ASCII-файла в scipy.array и не понимаю: мало того, что считывается символ перевода строки ‘\n’, массив ни в какую не хочет быть числовым, чтобы производить над собой операции суммирования и прочие хорошие вещи. Может, есть какая-то хитрость при работе с ASCII? ?звините, если вопрос не совсем в тему — я в питоне новичок, и с фортрана на него тяжело перестроить мозг))
2esmoreido
Это он у вас в лист считался. Попробуйте вот этими способами
http://koldunov.net/?p=163
Либо надо явно переводить строковые значения в числовые.
2koldunovn
О! Большое спасибо! Со вводом разобрался, а следовательно и с массивами. Количество кода по сравнению с фортраном приятно удивляет.
Спасибище! Отличная статья!
Подскажите, как правильно оформить записи:
(1/mat)*x2 и mat**(-1)*x2
если mat = array([
[1, 1, 1, 1, 1, 1],
[3663165, 3906041, 2943286, 2888036, 3609679, 3213539],
[552278, 2033032, 1719699, 2894847, 2894847, 2894847],
[1299984521, 1432458289, -16558236, -74551536, -1148293023, 1731524937],
[155843454, -288183992, 2094516226, -1878974820, -187007055, -195429603],
[68311268, 1460574272, -1867816343, 657958913, 657958913, 657958913]
])
а x2 = array(
[57.1819, 57.19887, 57.11356, 57.10451, 57.16988, 57.13833]
)
В питоне у меня получаются неверные значения, а проверяю я в Маткаде.
Hi there! Quick question that’s completely off topic.
Do you know how to make your site mobile friendly? My website
looks weird when viewing from my apple iphone. I’m trying
to find a theme or plugin that might be able to correct this problem.
If you have any recommendations, please share. Many thanks!
Because the admin of this web site is working, no doubt very rapidly it will be renowned, due to
its feature contents.
This site was… how do you say it? Relevant!!
Finally I’ve found something that helped me. Cheers!
Hello, I read your blog regularly. Your writing style is awesome,
keep up the good work!
I was curious if you ever considered changing the
layout of your site? Its very well written; I love what youve got to say.
But maybe you could a little more in the way of content so
people could connect with it better. Youve got an awful lot of text for only having one or two images.
Maybe you could space it out better?
This design is spectacular! You obviously know how to keep
a reader entertained. Between your wit and your videos, I was almost moved
to start my own blog (well, almost…HaHa!) Excellent job.
I really enjoyed what you had to say, and more than that, how you presented it.
Too cool!
Hello there! This is kind of off topic but I need some
advice from an established blog. Is it very hard to set up your own blog?
I’m not very techincal but I can figure things out pretty quick.
I’m thinking about setting up my own but I’m not
sure where to start. Do you have any ideas or suggestions?
With thanks
Remarkable things here. I am very glad to peer your article.
Thank you so much and I’m taking a look forward to contact you.
Will you please drop me a e-mail?
Always a huge fan of linking to bloggers that I appreciate but do not get a lot of link appreciate from.
Go Here To Review Our Service
Hi,
Thelocation3 is a website that collects opinions from webmasters/bloggers/business owners for Bing, Bluehost, etc.
We are looking for people like you to test our website.
They spend *,000,000,000 dollars each year collecting data, and then improving their products.
Thelocation3 pays to each member $ *** daily for their opinions.
Interested? Click here: https://www.thelocation3.com/paidsurvey
Looking forward to hearing from you,
Debbie Tanner
^^^^^^^^
Unsubscribe: https://www.thelocation3.com/unsubscribe
That would be the end of this report. Here you will obtain some websites that we feel you
Propecia De Farmacia Buy Cialis Cialis 5 Mg Le Prix generic cialis Propecia Covered By Insurance Hair Loss
Hi there just wanted to give you a quick heads up.
The text in your article seem to be running off the screen in Opera.
I’m not sure if this is a format issue or something to
do with web browser compatibility but I figured I’d post to
let you know. The layout look great though! Hope you get the problem solved soon. Many thanks
Every after inside a though we choose blogs that we study. Listed beneath are the most recent web sites that we choose.
Here are a number of the web-sites we recommend for our visitors.
We prefer to honor numerous other world-wide-web web sites on the web, even though they aren
Cialis Frei Erhaltlich Lander Buy Cialis Buy Discount Secure Provera Real No Prior Script Buy Cialis Amoxicillin Dosage For Tooth Infections
Priligy Latinoamerica Cialis Amoxicillin Drug Effect Cialis Propecia Male Breast Cancer
Sites of interest we’ve a link to.
BfDFx3 You actually make it appear so easy together with your presentation however I in finding this
I cannot thank you enough for the article.Much thanks again.
Durer Plus Longtemps Au Lit Ce Soir buy cheap cialis online Amoxicillin Merck cialis pills Photos Of Amoxil Pills