{ "info": { "author": "mrava", "author_email": "mrava@equinor.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)", "Natural Language :: English", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Scientific/Engineering :: Mathematics" ], "description": "![PyLops](https://github.com/equinor/pylops/blob/master/docs/source/_static/pylops_b.png)\n\n[![PyPI version](https://badge.fury.io/py/pylops.svg)](https://badge.fury.io/py/pylops)\n[![Anaconda-Server Badge](https://anaconda.org/conda-forge/pylops/badges/version.svg)](https://anaconda.org/conda-forge/pylops)\n[![Build Status](https://travis-ci.org/equinor/pylops.svg?branch=master)](https://travis-ci.org/equinor/pylops)\n[![AzureDevOps Status](https://dev.azure.com/MRAVA/PyLops/_apis/build/status/equinor.pylops?branchName=master)](https://dev.azure.com/MRAVA/PyLops/_build/latest?definitionId=1&branchName=master)\n[![Documentation Status](https://readthedocs.org/projects/pylops/badge/?version=latest)](https://pylops.readthedocs.io/en/latest/?badge=latest)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f24504b617ad40f188b73afc0722b5b8)](https://www.codacy.com/app/mrava87/pylops?utm_source=github.com&utm_medium=referral&utm_content=equinor/pylops&utm_campaign=Badge_Grade)\n[![Codacy Coverage](https://api.codacy.com/project/badge/Coverage/f24504b617ad40f188b73afc0722b5b8)](https://www.codacy.com/app/mrava87/pylops?utm_source=github.com&utm_medium=referral&utm_content=equinor/pylops&utm_campaign=Badge_Coverage)\n[![OS-support](https://img.shields.io/badge/OS-linux,osx-850A8B.svg)](https://github.com/equinor/pylops)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pylops.svg)\n[![Slack Status](https://img.shields.io/badge/chat-slack-green.svg)](https://pylops.slack.com)\n\n## Objective\nThis Python library is inspired by the MATLAB [Spot \u2013 A Linear-Operator Toolbox](http://www.cs.ubc.ca/labs/scl/spot/) project.\n\nLinear operators and inverse problems are at the core of many of the most used algorithms\nin signal processing, image processing, and remote sensing. When dealing with small-scale problems,\nthe Python numerical scientific libraries [numpy](http://www.numpy.org)\nand [scipy](https://www.scipy.org/scipylib/index.html) allow to perform many\nof the underlying matrix operations (e.g., computation of matrix-vector products and manipulation of matrices)\nin a simple and compact way.\n\nMany useful operators, however, do not lend themselves to an explicit matrix\nrepresentation when used to solve large-scale problems. PyLops operators, on the other hand, still represent a matrix\nand can be treated in a similar way, but do not rely on the explicit creation of a dense (or sparse) matrix itself. Conversely,\nthe forward and adjoint operators are represented by small pieces of codes that mimic the effect of the matrix\non a vector or another matrix.\n\nLuckily, many iterative methods (e.g. cg, lsqr) do not need to know the individual entries of a matrix to solve a linear system.\nSuch solvers only require the computation of forward and adjoint matrix-vector products as done for any of the PyLops operators.\n\nHere is a simple example showing how a dense first-order first derivative operator can be created,\napplied and inverted using numpy/scipy commands:\n```python\nimport numpy as np\nfrom scipy.linalg import lstsq\n\nnx = 7\nx = np.arange(nx) - (nx-1)/2\n\nD = np.diag(0.5*np.ones(nx-1), k=1) - \\\n np.diag(0.5*np.ones(nx-1), k=-1)\nD[0] = D[-1] = 0 # take away edge effects\n\n# y = Dx\ny = np.dot(D, x)\n# x = D'y\nxadj = np.dot(D.T, y)\n# xinv = D^-1 y\nxinv = lstsq(D, y)[0]\n```\nand similarly using PyLops commands:\n```python\nfrom pylops import FirstDerivative\n\nDlop = FirstDerivative(nx, dtype='float64')\n\n# y = Dx\ny = Dlop*x\n# x = D'y\nxadj = Dlop.H*y\n# xinv = D^-1 y\nxinv = Dlop / y\n```\n\nNote how this second approach does not require creating a dense matrix, reducing both the memory load and the computational cost of\napplying a derivative to an input vector x. Moreover, the code becomes even more compact and espressive than in the previous case\nletting the user focus on the formulation of equations of the forward problem to be solved by inversion.\n\n\n## Project structure\nThis repository is organized as follows:\n* **pylops**: python library containing various linear operators and auxiliary routines\n* **pytests**: set of pytests\n* **testdata**: sample datasets used in pytests and documentation\n* **docs**: sphinx documentation\n* **examples**: set of python script examples for each linear operator to be embedded in documentation using sphinx-gallery\n* **tutorials**: set of python script tutorials to be embedded in documentation using sphinx-gallery\n\n## Getting started\n\nYou need **Python 3.5 or greater**.\n\n#### From PyPi\n\nIf you want to use PyLops within your codes,\ninstall it in your Python environment by typing the following command in your terminal:\n\n```\npip install pylops\n```\n\nOpen a python terminal and type:\n\n```\nimport pylops\n```\n\nIf you do not see any error, you should be good to go, enjoy!\n\n#### From Conda-forge\n\nAlternatively, you can install PyLops using the conda-forge distribution by typing the following command in your terminal:\n\n```\nconda install -c conda-forge pylops\n```\n\n#### From Github\n\nYou can also directly install from the master node (although this is not reccomended)\n\n```\npip install git+https://git@github.com/equinor/pylops.git@master\n```\n\n#### From Docker\n\nFinally, if you simply want to try PyLops but do not have Python in your\nlocal machine, you can use our [Docker](https://www.docker.com) image. After installing Docker in your computer,\ntype the following command in your terminal (note that this will take some time the first time\nyou type it as you will download and install the docker image):\n\n```\ndocker run -it -v /path/to/local/folder:/home/jupyter/notebook -p 8888:8888 mrava87/pylops:notebook\n```\n\nThis will give you an address that you can put in your browser and will open a jupyter-notebook enviroment with PyLops\nand other basic Python libraries installed. Here `/path/to/local/folder` is the absolute path of a local folder\non your computer where you will create a notebook (or containing notebooks that you want to continue working on). Note that\nanything you do to the notebook(s) will be saved in your local folder.\n\nA larger image with Conda distribution is also available. Simply use `conda_notebook` instead of `notebook` in the\nprevious command.\n\n## Contributing\n\n*Feel like contributing to the project? Adding new operators or tutorial?*\n\nWe advise using the [Anaconda Python distribution](https://www.anaconda.com/download)\nto ensure that all the dependencies are installed via the `Conda` package manager. Follow\nthe following instructions and read carefully the [CONTRIBUTING](CONTRIBUTING.md) file before getting started.\n\n### 1. Fork and clone the repository\n\nExecute the following command in your terminal:\n\n```\ngit clone https://github.com/your_name_here/pylops.git\n```\n\n### 2. Install PyLops in a new Conda environment\nTo ensure that further development of PyLops is performed within the same environment (i.e., same dependencies) as\nthat defined by ``requirements-dev.txt`` or ``environment-dev.yml`` files, we suggest to work off a new Conda enviroment.\n\nThe first time you clone the repository run the following command:\n```\nmake dev-install_conda\n```\nTo ensure that everything has been setup correctly, run tests:\n```\nmake tests\n```\nMake sure no tests fail, this guarantees that the installation has been successfull.\n\nRemember to always activate the conda environment every time you open a new terminal by typing:\n```\nsource activate pylops\n```\n\n## Documentation\nThe official documentation of PyLops is available [here](https://pylops.readthedocs.io/).\n\nVisit this page to get started learning about different operators and their applications as well as how to\ncreate new operators yourself and make it to the ``Contributors`` list.\n\nMoreover, if you have installed PyLops using the *developer environment* you can also build the documentation locally by\ntyping the following command:\n```\nmake doc\n```\nOnce the documentation is created, you can make any change to the source code and rebuild the documentation by\nsimply typing\n```\nmake docupdate\n```\nNote that if a new example or tutorial is created (and if any change is made to a previously available example or tutorial)\nyou are required to rebuild the entire documentation before your changes will be visible.\n\n\n## History\nPyLops was initially written and it is currently maintained by [Equinor](https://www.equinor.com).\nIt is a flexible and scalable python library for large-scale optimization with linear\noperators that can be tailored to our needs, and as contribution to the free software community.\n\n## Citing\nWhen using ``pylops`` in scientific publications, please cite the following paper:\n\n- Ravasi, M., and Vasconcelos I., *PyLops--A Linear-Operator Python Library for large scale optimization*,\n arXiv preprint, [arXiv:1907.12349](https://arxiv.org/abs/1907.12349) (2019).\n\n## Contributors\n* Matteo Ravasi, mrava87\n* Carlos da Costa, cako\n* Dieter Werthm\u00fcller, prisae\n* Tristan van Leeuwen, TristanvanLeeuwen\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "algebra,inverse problems,large-scale optimization", "license": "", "maintainer": "", "maintainer_email": "", "name": "pylops", "package_url": "https://pypi.org/project/pylops/", "platform": "", "project_url": "https://pypi.org/project/pylops/", "project_urls": null, "release_url": "https://pypi.org/project/pylops/1.6.0/", "requires_dist": [ "numpy (>=1.15.0)", "scipy", "llvmlite ; extra == 'advanced'", "numba ; extra == 'advanced'", "pyfftw ; extra == 'advanced'", "scikit-fmm ; extra == 'advanced'", "spgl1 ; extra == 'advanced'" ], "requires_python": "", "summary": " Python library implementing linear operators to allow solving large-scale optimization problems without requiring to explicitly create a dense (or sparse) matrix.", "version": "1.6.0" }, "last_serial": 5659822, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "7ac549585fcd47b0f473829552db9270", "sha256": "6b673aea894287471d1a7dac303b011c01c4091735dddddc0d23ee0db578cda1" }, "downloads": -1, "filename": "pylops-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7ac549585fcd47b0f473829552db9270", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75651, "upload_time": "2018-12-02T06:55:16", "url": "https://files.pythonhosted.org/packages/29/54/b2cb0a2739c6a3b667173731274a43eac8e210e26a5f0825f8f082f3e591/pylops-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cbb47fb810e9b180fe2b06266846a5e", "sha256": "14aec161b8e9206b43325bd604166445621cdab6c4daed32e0e557e42f8466a5" }, "downloads": -1, "filename": "pylops-1.0.0.tar.gz", "has_sig": false, "md5_digest": "6cbb47fb810e9b180fe2b06266846a5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46606518, "upload_time": "2018-12-02T06:55:50", "url": "https://files.pythonhosted.org/packages/94/46/2a85340e473f2ab78595bafc2e99192627149437c28aa835e7b044327287/pylops-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d514620d150ff84023cbe0d4f6d48b51", "sha256": "0397142d3f121d1fdb0b9cf094611d153400756c6452ba55f7f8d21648680b41" }, "downloads": -1, "filename": "pylops-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d514620d150ff84023cbe0d4f6d48b51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 79659, "upload_time": "2018-12-11T22:07:28", "url": "https://files.pythonhosted.org/packages/52/85/159f9343e8c8afc84414aa44254c65a94df7a0870ff771b8509f5c43d2db/pylops-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "160c19fc88d96507d02c84ceba4c97a0", "sha256": "2600ee3b4e5461047245478e02f3a2df493c5f7f23d73433425b32acc4248388" }, "downloads": -1, "filename": "pylops-1.1.0.tar.gz", "has_sig": false, "md5_digest": "160c19fc88d96507d02c84ceba4c97a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46610092, "upload_time": "2018-12-11T22:10:34", "url": "https://files.pythonhosted.org/packages/4a/a6/72b0a33705de2f3014336f0c20cc6885a9969960cc17e6c1dc3852375ab8/pylops-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "f78894dc26a9934e7c07ca8b905748a7", "sha256": "cb9c90b4a640115327e41cd55fa9364ba34ffcea7d2e4bde0093e219efdea933" }, "downloads": -1, "filename": "pylops-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f78894dc26a9934e7c07ca8b905748a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 97608, "upload_time": "2019-01-13T14:35:38", "url": "https://files.pythonhosted.org/packages/87/cd/fb18973008b993be038f4888f400b489c9f9d80d7fb8a8b39e26d9cf6e2c/pylops-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "195d200c8ae09728de5ab84751325608", "sha256": "41f3d4f1e7e8b6f62ab87208aff9d0520f5fb24e0bf6eb97630c0ef78a1c57a9" }, "downloads": -1, "filename": "pylops-1.2.0.tar.gz", "has_sig": false, "md5_digest": "195d200c8ae09728de5ab84751325608", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46636317, "upload_time": "2019-01-13T14:35:55", "url": "https://files.pythonhosted.org/packages/0f/7c/1837973b2933adaba692a2c641c85d110c6b1ca6db8d4eae999bb0d671d1/pylops-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "1cc205b289edaf86aba1db640cf977ec", "sha256": "c4e6da91f2d992cc4e03e1fdc4ee58672c8a931fff7f5354c114150e0cc7d4d6" }, "downloads": -1, "filename": "pylops-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1cc205b289edaf86aba1db640cf977ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 113841, "upload_time": "2019-02-24T16:25:12", "url": "https://files.pythonhosted.org/packages/22/36/4948e1c8da56ef9ba7499f132f3bccbaf31d4542923d8089726933a4ccbf/pylops-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8a914a6bffa7ed49e6d520d08da94f3b", "sha256": "14d8a68166056a7d41454f93fc7037c7e130cf97d1a068743a082a5a5010a11c" }, "downloads": -1, "filename": "pylops-1.3.0.tar.gz", "has_sig": false, "md5_digest": "8a914a6bffa7ed49e6d520d08da94f3b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46656957, "upload_time": "2019-02-24T16:25:33", "url": "https://files.pythonhosted.org/packages/f5/24/b37c21defbb5b9410c98e279f031ef2ba4a56e9f92e96b2708d433f480a6/pylops-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "24c5f141a7b4f08a986b3c83fe96df22", "sha256": "6212f9335b31b5b27466177f6aac8583a2595f98fa4ba07042562b89be3e8daa" }, "downloads": -1, "filename": "pylops-1.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "24c5f141a7b4f08a986b3c83fe96df22", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 141655, "upload_time": "2019-05-01T15:58:41", "url": "https://files.pythonhosted.org/packages/ba/5a/dc9d93cd0f9ba3ea9a77c30c92865f07523ebf2fc391dff19aeca2f2b848/pylops-1.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a86f8d80a5d929beea338acfd47fb7fc", "sha256": "ea206fa39af39c42c75751fc935777b1c91db40d7d1f27160aaefd62ffec63e2" }, "downloads": -1, "filename": "pylops-1.4.0.tar.gz", "has_sig": false, "md5_digest": "a86f8d80a5d929beea338acfd47fb7fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46686335, "upload_time": "2019-05-01T15:58:58", "url": "https://files.pythonhosted.org/packages/25/d4/5f7f37cf96e951fc50f5070102b9b2ea9badb22aca1a6af18d0eff2183f7/pylops-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "43376e01fda1d5387befa22b8c19d3c6", "sha256": "8a88e4385ab7af844e4648bf929fc2039656f41fe1b4869381ff5d8eb231f72f" }, "downloads": -1, "filename": "pylops-1.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "43376e01fda1d5387befa22b8c19d3c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 158569, "upload_time": "2019-06-30T12:27:48", "url": "https://files.pythonhosted.org/packages/e5/7e/73db986a0186041ca25ccb389183eb97080e832799d6830b09c0f98ac3a1/pylops-1.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c2c242025e88ac3b4d4b9bd987435540", "sha256": "e9460fd2d147070cb508267a2a9ce11037c87e472e7ddb85d81c4d12f83ca282" }, "downloads": -1, "filename": "pylops-1.5.0.tar.gz", "has_sig": false, "md5_digest": "c2c242025e88ac3b4d4b9bd987435540", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46815005, "upload_time": "2019-06-30T12:28:06", "url": "https://files.pythonhosted.org/packages/41/67/d503aa1477ab81432816fb1afd18bf0abbaff1749d051be0b6aa59c2c235/pylops-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "9813ea70f040e436bcdd2df1f99b0697", "sha256": "f874580b274bae3924949ebf31e1b773dd32be1feb1bc81e01a7f1d644f2fd03" }, "downloads": -1, "filename": "pylops-1.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9813ea70f040e436bcdd2df1f99b0697", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 162076, "upload_time": "2019-08-10T16:41:57", "url": "https://files.pythonhosted.org/packages/b3/6e/76c41ee893a0943898b426526da0a357d3ea04065c523e2c302df7326f6f/pylops-1.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "117e71a2b73ae822a16cbaf33e91a9ab", "sha256": "966e33dba76d368058c3402b18aaf0b72e183503b46afeb6f8465897f33aafdd" }, "downloads": -1, "filename": "pylops-1.6.0.tar.gz", "has_sig": false, "md5_digest": "117e71a2b73ae822a16cbaf33e91a9ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46821715, "upload_time": "2019-08-10T16:42:15", "url": "https://files.pythonhosted.org/packages/f7/5f/51142663e4a118a77978801d339c76bf89e8cf00810784858f07e68b2676/pylops-1.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9813ea70f040e436bcdd2df1f99b0697", "sha256": "f874580b274bae3924949ebf31e1b773dd32be1feb1bc81e01a7f1d644f2fd03" }, "downloads": -1, "filename": "pylops-1.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9813ea70f040e436bcdd2df1f99b0697", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 162076, "upload_time": "2019-08-10T16:41:57", "url": "https://files.pythonhosted.org/packages/b3/6e/76c41ee893a0943898b426526da0a357d3ea04065c523e2c302df7326f6f/pylops-1.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "117e71a2b73ae822a16cbaf33e91a9ab", "sha256": "966e33dba76d368058c3402b18aaf0b72e183503b46afeb6f8465897f33aafdd" }, "downloads": -1, "filename": "pylops-1.6.0.tar.gz", "has_sig": false, "md5_digest": "117e71a2b73ae822a16cbaf33e91a9ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46821715, "upload_time": "2019-08-10T16:42:15", "url": "https://files.pythonhosted.org/packages/f7/5f/51142663e4a118a77978801d339c76bf89e8cf00810784858f07e68b2676/pylops-1.6.0.tar.gz" } ] }