# ITK 5.1 Beta 1: NumPy Interface, Part 1

**URL:** <https://discourse.itk.org/t/itk-5-1-beta-1-numpy-interface-part-1/2260>\
**Category:** Announcements\
**Tags:** release, numpy, itk-releases\
**Created:** [September 24, 2019, 8:31pm UTC](https://discourse.itk.org/t/itk-5-1-beta-1-numpy-interface-part-1/2260 "2019-09-24T20:31:47Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![matt.mccormick](https://discourse.itk.org/user_avatar/discourse.itk.org/matt.mccormick/32/7_2.png) [@matt.mccormick](https://discourse.itk.org/u/matt.mccormick)\
**Post date:** [September 24, 2019, 8:31pm UTC](https://discourse.itk.org/t/itk-5-1-beta-1-numpy-interface-part-1/2260/1 "2019-09-24T20:31:47Z")

</div>

We are happy to announce that the Insight Toolkit (ITK) 5.1 Beta 1 is available for testing! 🎉 ITK is an open-source, cross-platform toolkit for N-dimensional scientific image processing, segmentation, and registration.

ITK 5.1 Beta 1 is a pre-release to enable testing of major improvements to ITK’s NumPy interface.

**Python Packages**

ITK Python packages can be installed by running:

```auto
pip install --upgrade --pre itk

```

The `--pre` flag will install the beta pre-release.

**Library Sources**

- [InsightToolkit-5.1b01.tar.gz](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/InsightToolkit-5.1b01.tar.gz)
- [InsightToolkit-5.1b01.zip](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/InsightToolkit-5.1b01.zip)

**Testing Data**

Unpack optional testing data in the same directory where the Library Source is unpacked.

- [InsightData-5.1b01.tar.gz](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/InsightData-5.1b01.tar.gz)
- [InsightData-5.1b01.zip](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/InsightData-5.1b01.zip)

**Checksums**

- [MD5SUMS](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/MD5SUMS)
- [SHA512SUMS](https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.1b01/SHA512SUMS)

## Pass NumPy Array’s to ITK Image Filters

The [Pythonic, functional-like interface](https://discourse.itk.org/t/itk-5-0-beta-1-pythonic-interface/1271) to all ITK image-to-image-filters now directly supports operation on [NumPy array’s](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html), i.e. `numpy.ndarray`. If a `ndarray` is passed as an input, a `ndarray` is returned as an output.

For example,

```auto
smoothed = itk.median_image_filter(array, radius=2)

```

Previously, explicit conversion to / from an `itk.Image` was required with `itk.array_from_image` and `itk.image_from_array`.

We can now also convert an `itk.Image` to a `numpy.ndarray` with the standard `np.asarray` call.

```auto
import numpy as np
import itk

image = itk.imread('/path/to/image.tif')
array = np.asarray(image)

```

## Python 3 Only

ITK 5.1 will be the first Python 3-only release. Consistent with most scientific Python packages and [CPython’s 2020 drop in support](https://pythonclock.org), Python 2 support and binaries will no longer be available.

## clang-format enforced C++ coding style

ITK has adopted a [_.clang-format_](https://github.com/InsightSoftwareConsortium/ITK/blob/master/.clang-format) coding style configuration file so a consistent coding style can automatically be applied to C++ code with the [`clang-format`](http://releases.llvm.org/download.html) binary. A consistent coding style is critical for readability and collaborative development.

`clang-format` has been applied to the entire codebase. The Whitesmiths style of brace indentation, previously part of the [ITK Coding Style Guidelines](https://itk.org/ItkSoftwareGuide.pdf), is not supported by clang-format, so it has been replaced by a brace style consistent with VTK’s current style.

A Git commit hook will automatically apply `clang-format` to changed C++ code. We are refining the related documentation and improving automated application of the style.

## Point Set Registration Parallelism

ITK provides a powerful registration framework for point-set registration, offering information-theoretic similarity metrics, labeled point-set metrics, and spatial transformation models that range from affine to b-spline to dense displacement fields. ITK 5.1 features enhanced parallelism in point-set metric computation, leveraging the [native thread-pool and Threading Building Blocks (TBB)](https://discourse.itk.org/t/itk-5-0-alpha-2-performance/959) enhancements in ITK 5.

## ITK 5 Improvements

Many more improvements and refinements were added since the ITK 5.0.0 release, which are detailed in the change log below. For example, a number of improvements were made to the _itk::SpatialObject’s_.

## Congratulations

Congratulations and **thank you** to everyone who contributed to this release. Of the 25 authors, we would like to specially recognize the new contributors: James Butler, Neslisah Torosdagli, Rinat Mukhometzianov, Genevieve Buckley, and yjcchen091.

## What’s Next

Additional improvements ITK’s NumPy interface are [planned for the next pre-release](https://github.com/InsightSoftwareConsortium/ITK/milestone/11). Try out the current release, and take part in the community discussion at [discourse.itk.org](https://discourse.itk.org/uploads/short-url/wTTx4CVz8Ytn8G9rVo8QSk8OWRz.png). Contribute with pull requests, code reviews, and issue discussions in our [GitHub Organization](https://github.com/InsightSoftwareConsortium).

**Enjoy ITK!**

## Changes from 5.0.0 to 5.1 Beta 1

```auto
Bradley Lowekamp @blowekamp (32):
      BUG: Use ProcessObject GetInput to obtain base pointer
      BUG: Fix ProcessObject::RemoveOutput for null objects.
      COMP: Address missing fftw include in CurvatureRegistrationFilter
      BUG: Fix ProcessObject::RemoveOutput for null objects.
      BUG: Add casting for vector pixel types
      STYLE: Use CTEST_TEST_TIMEOUT
      ENH: Add testing for CastImageFilter for more type conversions
      BUG: Restore support for Cast between explicitly cast-ed pixel type
      BUG: Use ProcessObject GetInput to obtain base pointer
      ENH: Add testing for CastImageFilter for more type conversions
      BUG: Restore support for Cast between explicitly cast-ed pixel type
      BUG: Add DataObject::New method
      BUG: Install FFTW headers in same location as ITK
      Revert "BUG: InterpolateImageFunction::GetRadius hidden in ITKV4_COMPATIBILITY"
      BUG: Preserve Interpolate GetRadius behavior with ITKv4Compatibility
      Revert "COMP: forgotten class for ITKV4_COMPATIBILITY in 2aae174"
      BUG: HDF5 is clobbering ctest TIMEOUT variables
      COMP: Fix not marked 'override' for ImageSink destructor
      BUG: Use enable_if with SFINAE to dispatch
      ENH: Add Vector constructor from C arrays with cast
      COMP: Work around uninitialized value warnings
      ENH: Update ITKv4 registration example to use resample over warp
      BUG: Specify specific CircleCI docker image with platform
      COMP: Address compilation warning with aggregate initializer
      BUG: Specify specific CircleCI docker image with platform
      ENH: Adding VS2019 v142, VS2017 v140 Azure Pipelines on merge
      DOC: Tweak internal documentation in SliceImageFilter
      BUG: Address bug with small size in output of SliceImageFilter
      ENH: Add more test cases for the SliceImageFilter
      COMP: Address internal compiler error on MSVC 19.0.24234.1 (v140)
      ENH: Add check expected input in HistogramMatchingImageFilter
      COMP: Add missing enum type_name from prior enum declaration style

Csaba Pinter @cpinter (2):
      BUG: Fix loading of DICOM files with no preamble
      ENH: Add test for DICOM without preamble for DCMTK and GDCM

Davis Vigneault @DVigneault (1):
      BUG: Make BuildCellLinks method const

Dženan Zukić @dzenanz (32):
      BUG: number of work units was greater than 1 even for 1 thread
      BUG: fix a crash with ITK_DEFAULT_MAX_THREADS greater than 250
      BUG: resample filter no longer triggers unnecessary exception
      COMP: change export specification to template for un-specialized method
      COMP: forgotten class for ITKV4_COMPATIBILITY in 2aae174
      ENH: use double-conversion's CMake targets
      COMP: fix warning about missing override in CastImageFilter
      DOC: wrong class name for PlatformMultiThreader
      COMP: get rid of MSVC's warning 4661
      ENH: enable GaussianInterpolateImageFunction to work with streaming
      STYLE: reduce space in ivar declarations
      STYLE: ITK indentation style in test
      STYLE: invert the name and internal logic of waiting for threads
      BUG: ThreadPool::DoNotWaitForThreads did not work properly
      STYLE: Add ITK prefix to testing macros in release branch
      DOC: invocation of AddWork uses -> because instance is always a pointer
      ENH: updating remote modules
      ENH: PoolMultiThreader uses one less thread
      ENH: documenting supported compilers
      ENH: updating remote modules
      STYLE: more consistent code formatting in test driver
      BUG: offset was not updated after changing Euler angle order (ZYX)
      Fix broken link in Data.md
      ENH: support RGB image in windowed sinc interpolation
      ENH: support RGB image in windowed sinc interpolation
      ENH: updating remote modules
      ENH: back-porting #1165 to support Visual Studio 2019
      ENH: updating remote modules
      COMP: fixed enum name error when legacy is OFF and ITK_USE_GPU is ON
      ENH: removing deprecated Python functionality: imp
      ENH: removing deprecated Python functionality: sys.version_info 2/3
      ENH: removing deprecated Python functionality: import print_function

Francois Budin @fbudin69500 (4):
      BUG: ImageBase regions and ImageRegion properties are returned as reference
      DOC: Add ITK 5.0 release notes
      BUG: m_NumberOfPointPixels was set equal to m_NumberOfPoints
      ENH: Adds swig include directory to command line

GDCM Upstream (1):
      GDCM 2019-05-22 (cc5358a1)

Genevieve Buckley @GenevieveBuckley (1):
      BUG: All exceptions must be derived from python's BaseException class

Hans J. Johnson @hjmjohnson (64):
      ENH: Update SphinxExamples to lastest master branch
      COMP: Add attribute for large doxygen config file.
      DOC: Remove ITK_FUTURE_LEGACY_REMOVE from documentation
      ENH: Disable remote module processing when creating doxygen.
      STYLE: Prevent double initialization
      DOC: Purge outdated media wiki WikiExamples
      BUG: Missed propagation of library dependancies
      ENH: Deprecate Neuralnetwork module
      Revert "Merge pull request #1039 from samuelgerber/MultithreadPointSetToPointSetMetricv4"
      STYLE: Remove deprecated support for ITK_WRAP_PYTHON_LEGACY
      DOC: Only warn when Module_NeuralNetworks is selected
      ENH: Use consistent project name with module name
      COMP: Fix clang-format nesting of empty macros
      DOC: Deprecate https://itk.org/Wiki/ITK/Examples content.
      DOC: Provide doxygen links for sphinx
      DOC: Improve the documentation clarity for NormalizeImage.
      DOC: Moved wiki examples to sphinx examples part2
      ENH: itkObjectToObjectOptimizerBase Must be explicitly instantiated
      COMP: Terminate conditional doxygen sections
      DOC: Set class name for StreamingProcessObject doxygen
      ENH: Update the DoxygenLayout.xml file
      ENH: Update template files for Doxygen.
      BUG: Patch submission scripts conflict with doxygen
      COMP: Resolve 1000's of alias warnings in 1.8.15
      DOC: Moved wiki pages to sphinx examples
      BUG: Flawed logic for itkExceptionObject.h guards
      STYLE: Use override statements for C++11
      STYLE: Prefer c++11 'using' to 'typedef'
      COMP: Another work around uninitialized value warnings
      ENH: Prefer c++11 'using' to 'typedef' for structs
      COMP: Update AnalyzeObjectMapIO remote for ITKv5.0
      COMP: Suppress warning about file that is too large
      STYLE: Use = default for trivial constructors
      STYLE: For loops can have a space before ;
      STYLE: Suppress longstanding kwstyle violations
      STYLE: Use templated function over macro
      ENH: Add LONGLONG & ULONGLONG types
      STYLE: Remove unused protected ivar m_MyProduct
      COMP: Isolate RAWIO non-templated code in cxx file
      PERF: Byteswap only when request != system byte order
      STYLE: Suppress longstanding kwstyle violations
      STYLE: Define the .clang-format config file
      ENH: Add script to assist with running clang-format on topic-branches
      ENH: Update C++/C attributes for itk style conformance.
      ENH: Add copy of git-clang-format from llvm binaries
      ENH: Add cmake configuration for clang-format
      ENH: Setup clang-format hooks for pre-commit-style
      DOC: Add missing line separator for ingroup ITKCommon
      DOC: Fix spelling typo VeriyInput -> VerifyInput
      ENH: Refactor to allow ReferenceHistogram instead of ReferenceImage
      COMP: Remove One Definition Rule conflict
      COMP: Fix missing type specialization for `unsigned long long int`
      STYLE: Convert 'enum' to 'enum class' objects with print enum function
      ENH: Workaround MSVC preprocessor name conflict
      STYLE: Prefer enum class definitions internally
      STYLE: Prefer consistent capitalization of Colormap
      ENH: Ignore wrapping warnings for `enum class`
      BUG: Missing ImageAdapter function signatures
      COMP: Change KWStyle to allow reformat to pass.
      STYLE: No-space inside <> () []
      STYLE: Change the packing of parameters.
      STYLE: Use shorter column length for Software Guide.
      STYLE: End of history preceeding clang-format-8.0 style
      STYLE: Fix spelling error foramt -> format

ITK Maintainer (1):
      STYLE: Enforce ITK style defined by .clang-format

James Butler @jamesobutler (1):
      COMP: Add cmake_minimum_required to ITKNumericsFEM

Jean-Christophe Fillion-Robin @jcfr (1):
      ENH: Support building ITKNumericsFEM as external module

Jon Haitz Legarreta Gorroño @jhlegarreta (4):
      STYLE: Fix indentation in bash script
      ENH: Add script to update ITK testing macros names
      BUG: Fix remotes maintenance scripts
      BUG: Fix wrong variable names

Matthew McCormick @thewtex (61):
      ENH: Bump the ITK CMake version to 5.1.0
      ENH: New content links for ITK 5.0.0
      STYLE: DeformableRegistration2 line length warnings
      COMP: SpatialObjectsHierarchy Software Guide newline
      ENH: Bump CI ExternalDataVersion to 5.0.0
      DOC: Release generation updates for ITK 5.0.0
      DOC: Add a note about updating conda-forge for post wheels
      ENH: Update Doxygen to 1.8.15
      BUG: Add test/CMakeLists.txt stub to NumPy bridge
      COMP: Provide NumericTraits<complex<T>>::ZeroValue() definition
      COMP: Backwards compatibility testing macros without ITK_ prefix
      BUG: Get latest tag in UpdateRequiredITKVersionInRemoteModules.sh
      BUG: Filename vars in UpdateRequiredITKVersionInRemoteModules.sh
      ENH: UpdateRequiredITKVersionInRemoteModules bump patch version
      ENH: UpdateRequiredITKVersionInRemoteModules supports ITKPythonGitTag
      BUG: Do not require PyBUF_WRITABLE in GetArrayViewFromImage
      DOC: Update supported Python versions warning
      ENH: Require Python 3.5 or newer on all platforms
      BUG: ITKFixedPointInverseDisplacementField wrapping test config update
      BUG: Remove VectorExpandImageFilter wrapping
      BUG: Add PEP 366 __package__ support to ITKLazyModule
      COMP: Remove HasNumericTraitsCheck from ExpandImageFilter
      ENH: Wrap ExpandImageFilter with vector types
      BUG: Release the Python Global Interpreter Lock (GIL) during execution
      STYLE: Apply ITK Style Guidelines to itkPyCommand.cxx
      BUG: itk::PyCommand ensures the GIL state
      BUG: Support pickling LazyITKModule with cloudpickle
      BUG: Add Pipeline name to Azure configuration
      DOC: Update Azure Pipelines badge URL's
      BUG: Add wrapping for TransformMeshFilter
      ENH: Bump itkVersion.cmake for 5.0.1
      ENH: CI testing uses Python 3
      BUG: itkPyBufferTest: use bytes for Python 3 np.frombuffer
      BUG: Remove NumberOfComponents check in _GetImageViewFromArray
      BUG: Remove NumberOfComponents check in _GetImageViewFromArray
      DOC: Update ITK.Linux.Python and ITK.Coverage README badges
      BUG: Update SkullStrip module to address Doxygen configuration
      BUG: Use ITK_BUILD_DOCUMENTATION to enable Doxygen builds
      COMP: Update CastXML to 2019-07-15 master
      DOC: Minor release documentation updates
      ENH: Support numpy.asarray for itk.Image
      ENH: Directly set an itk.ImageBase Direction with a NumPy Array
      BUG: Ensure NumPy array is C-contiguous with matrix conversion
      BUG: Enable ITKBridgeNumPy for Windows CI builds
      DOC: AdaptiveHistogramEqualizationImageFilter default radius
      BUG: Do not run itkPyBufferMemoryLeakTest on Windows
      BUG: Remove Windows Python 2.7 hypot workaround
      ENH: Support NumPy array-like inputs to image filters
      DOC: Add Eigen license to NOTICE file
      ENH: Download clang-format 8.0.1 executable
      ENH: Add wrapping for LabelImageGaussianInterpolateImageFunction
      DOC: 'weight' spelling in LabelImageGaussianInterpolateImageFunction
      BUG: Add NumPy conversion for itk.Image[itk.Vector[itk.D,dim]]
      BUG: Wrap WindowedSincInterpolateImageFunction SmartPointer
      BUG: Do not apply style pre-commit hooks to ThirdParty code
      BUG: Do not download clang-format with ITK_FORBID_DOWNLOADS enabled
      BUG: Add missing KWStyle hook configuration
      ENH: Update clang-format binary path configuration
      BUG: Fix have_KWStyle detection when running clang-format hook
      BUG: Improvements to pre-commit-style hook for clang-format
      ENH: Check for required clang-format version in style hook

MetaIO Maintainers (1):
      MetaIO 2019-05-22 (5f90075b)

Mihail Isakov (1):
      ENH: added missing symbols to JPEG mangling header

Neslisah Torosdagli @neslimsah (2):
      BUG: Regression in PolygonSpatialObject::IsInsideInObjectSpace #1082
      BUG: Regression in PolygonSpatialObject::IsInsideInObjectSpace #1082

Niels Dekker @N-Dekker (22):
      PERF: Replace mutex by atomic in MersenneTwisterRandomVariateGenerator
      STYLE: Remove two duplicated #include <mutex> directives
      STYLE: Add const to MersenneTwisterRandomVariateGenerator::GetSeed()
      ENH: GTest MersenneTwisterRandomVariateGenerator::GetIntegerVariate()
      STYLE: Use image->TransformPhysicalPointToIndex(point), returning index
      ENH: ImageBase Transform-Vector single argument overloads more generic
      STYLE: Use image->TransformVectorToVector(gradient), returning gradient
      STYLE: Vector, CovariantVector(value) call base FixedArray(value)
      STYLE: FastMarching replace FixedArray Begin(), End() by range-based for
      STYLE: Replace FixedArray Begin(), End() by cbegin(), cend()
      STYLE: itkFixedArray.hxx using std::equal, and C++11 fill_n and copy_n
      STYLE: Add const to SetStartingShrinkFactors parameter
      STYLE: Replace std::copy(input, input + n, output) by C++11 std::copy_n
      ENH: Add ImageRegionRange, to iterate over the pixels of an image region
      COMP: No longer disable obsolete MSVC warning C4231 on 'extern' template
      STYLE: Order #pragma warning directives in itkWin32Header.h
      COMP: No longer disable obsolete MSVC warning C4231 in VNL/vxl/vcl
      BUG: Fix possible loss of data on type conversion
      COMP: QuadEdgeMesh::SetCell avoid assignment in conditional expression
      COMP: Remove (char) casts of hexadecimal int literals from UnicodeIOTest
      COMP: ImageRegionRangeGTest issue #1147 Unused function template warning
      COMP: Fix loss of data ProcessObject GetNumberOfValidRequiredInputs()

Pablo Hernandez-Cerdan @phcerdan (1):
      BUG: Fix COMPILE_DEFINITIONS of castxml

Rinat Mukhometzianov @rmukh (3):
      COMP: MSVC AVX flag fix
      COMP: Fix SSE for MSVC x86
      COMP: Replace legacy ITK_Check...Flag.cmake with check_..._flag cmake function

Samuel Gerber @samuelgerber (7):
      PERF: Remove Temporary Variable in GetMeasurementVector
      ENH: Add Multithreading to PointSetToPointSetMetricv4
      ENH: Add Multithreading to PointSetToPointSetMetricv4
      ENH: Add Multithreading to PointSetToPointSetMetricv4
      Revert "Revert "Merge pull request #1039 from samuelgerber/MultithreadPointSetToPointSetMetricv4""
      BUG: Fix PointSetToPointSetMetric Thread Safety
      BUG: Fix CompositeTransform ThreadSafety

Stephen Aylward @aylward (17):
      ENH: Updated Spatial Object tex to match ITKv5
      BUG: Fixed spelling mistakes and use of plural member functions
      ENH: Updated Spatial Object tex to match ITKv5
      BUG: Fixed spelling mistakes and use of plural member functions
      BUG: Fix grammar and naming mistakes in SpatialObject documentation
      DOC: Fixed expected output of examples and documentation
      BUG: Fix grammar and naming mistakes in SpatialObject documentation
      DOC: Fixed expected output of examples and documentation
      BUG: Use AddPoint() for PointBasedSpatialObjects to set SO
      ENH: Replace ExceptionObjects with itkExceptionMacro.
      BUG: Use AddPoint() for PointBasedSpatialObjects to set SO
      ENH: Replace ExceptionObjects with itkExceptionMacro.
      ENH: Converted TubeSpatialObject ComputeTangentsAndNormals to frenet
      BUG: Resolve corner case bug in ComputeTangentsAndNormals in TubeSO
      ENH: Improved IsInside computation (speed and accuracy) of tube
      ENH: Updating TubeSO test to match assumption that default is EndRounded
      BUG: operator= defined in [tube|*]SpatialObjectPoint incomplete

Steve Pieper @pieper (1):
      DOC: ITK5 SpatialObject Scene to Group change

VXL Maintainers (1):
      VNL 2019-08-15 (7cc97a62)

Ziv Yaniv @zivy (1):
      DOC: Correcting some grammer and updating the toolkit name. (#980)

@maekclena (10):
      STYLE: Add ITK prefix to testing macros
      BUG: Fix BSplineGradient configuration
      ENH: Mark VectorExpandImageFilter as deprecated
      ENH: Deprecate VectorCentralDifferenceImageFilter
      ENH: Remove VectorExpandImageFilter when ITK_LEGACY_REMOVE is on
      BUG: add required method for Pickling
      BUG: Fix GaussianInterpolateImageFunction with streaming
      BUG: Avoid buffer overwriting in DCMTKImageIO
      ENH: Disable itkDCMTKImageIOMultiFrameImageTest
      BUG: Mitigate overflow in DCMTKImageIO::Read

@yjcchen0913 (1):
      BUG: Ensure strict weak ordering in HessianToObjectnessMeasure's sort

```

---

<div class="post-metadata">

**Author:** ![lassoan](https://discourse.itk.org/user_avatar/discourse.itk.org/lassoan/32/27_2.png) [@lassoan](https://discourse.itk.org/u/lassoan)\
**Post date:** [September 25, 2019, 2:11pm UTC](https://discourse.itk.org/t/itk-5-1-beta-1-numpy-interface-part-1/2260/2 "2019-09-25T14:11:37Z")

</div>

Very impressive, thanks for all your hard work!

When numpy arrays are used as inputs/output, are image spacing and axis directions preserved?

---

<div class="post-metadata">

**Author:** ![matt.mccormick](https://discourse.itk.org/user_avatar/discourse.itk.org/matt.mccormick/32/7_2.png) [@matt.mccormick](https://discourse.itk.org/u/matt.mccormick)\
**Post date:** [September 25, 2019, 3:09pm UTC](https://discourse.itk.org/t/itk-5-1-beta-1-numpy-interface-part-1/2260/3 "2019-09-25T15:09:06Z")

</div>

> [@lassoan](#):
>
> When numpy arrays are used as inputs/output, are image spacing and axis directions preserved?

Not yet 😉 – we are working towards that with a [NumPy-based spatial image](https://discourse.itk.org/t/images-in-physical-space-in-python/2124).
