Skip to main content

Yet another nd2 (Nikon NIS Elements) file reader

Project description

nd2

License PyPI Python Version Tests codecov

Yet another .nd2 (Nikon NIS Elements) file reader.

This reader provides a Cython wrapper for the official Nikon SDK. (The actual reading of image frames, however, uses a direct memmap approach, instead of the SDK, for performance reasons and to avoid occasional segfaults from the SDK.)

Features good metadata retrieval, and direct to_dask and to_xarray options for lazy and/or annotated arrays.

This library is tested against many nd2 files with the goal of maximizing compatibility and data extraction. (If you find an nd2 file that fails in some way, please open an issue with the file!)

install

pip install nd2

Legacy nd2 (JPEG2000) files are also supported, but require imagecodecs. To install with support for these files use:

pip install nd2[legacy]

usage and API

import nd2
import numpy as np

my_array = nd2.imread('some_file.nd2')                          # read to numpy array
my_array = nd2.imread('some_file.nd2', dask=True)               # read to dask array
my_array = nd2.imread('some_file.nd2', xarray=True)             # read to xarray
my_array = nd2.imread('some_file.nd2', xarray=True, dask=True)  # read file to dask-xarray

# or open a file with nd2.ND2File
f = nd2.ND2File('some_file.nd2')

# attributes:   # example output
f.path          # 'some_file.nd2'
f.shape         # (10, 2, 256, 256)
f.ndim          # 4
f.dtype         # np.dtype('uint16')
f.size          # 1310720  (total voxel elements)
f.sizes         # {'T': 10, 'C': 2, 'Y': 256, 'X': 256}
f.is_rgb        # False (whether the file is rgb)
# if RGB, sizes will have an additional {'S': 3} component

# array output
f.asarray()         # in-memory np.ndarray
np.asarray(f)       # alternative to f.asarray()
f.to_dask()         # delayed dask.array.Array
f.to_xarray()       # in-memory xarray.DataArray, with labeled axes/coords
f.to_xarray(delayed=True)   # delayed xarray.DataArray

                    # see below for examples of these structures
# metadata          # returns instance of ...
f.attributes        # nd2.structures.Attributes
f.metadata          # nd2.structures.Metadata
f.frame_metadata(0) # nd2.structures.FrameMetadata (frame-specific meta)
f.experiment        # List[nd2.structures.ExpLoop]
f.voxel_size()      # VoxelSize(x=0.65, y=0.65, z=1.0)
f.text_info         # dict of misc info

# allll the metadata we can find...
# no attempt made to standardize or parse it
# look in here if you're searching for metdata that isn't exposed in the above
f.unstructured_metadata()
f.custom_data       # bits of unstructured metadata that start with CustomData

f.close()           # don't forget to close when done!
f.closed            # boolean, whether the file is closed

# ... or you can use it as a context manager
with nd2.ND2File('some_file.nd2') as ndfile:
    print(ndfile.metadata)
    xarr = ndfile.to_xarray()

Metadata structures

These follow the structure of the nikon SDK outputs. Here are some example outputs

attributes
Attributes(
    bitsPerComponentInMemory=16,
    bitsPerComponentSignificant=16,
    componentCount=2,
    heightPx=32,
    pixelDataType='unsigned',
    sequenceCount=60,
    widthBytes=128,
    widthPx=32,
    compressionLevel=None,
    compressionType=None,
    tileHeightPx=None,
    tileWidthPx=None,
    channelCount=2
)
metadata

Note: the metadata for legacy (JPEG2000) files will be a plain unstructured dict.

Metadata(
    contents=Contents(channelCount=2, frameCount=60),
    channels=[
        Channel(
            channel=ChannelMeta(name='Widefield Green', index=0, colorRGB=65371, emissionLambdaNm=535.0, excitationLambdaNm=None),
            loops=LoopIndices(NETimeLoop=None, TimeLoop=0, XYPosLoop=1, ZStackLoop=2),
            microscope=Microscope(
                objectiveMagnification=10.0,
                objectiveName='Plan Fluor 10x Ph1 DLL',
                objectiveNumericalAperture=0.3,
                zoomMagnification=1.0,
                immersionRefractiveIndex=1.0,
                projectiveMagnification=None,
                pinholeDiameterUm=None,
                modalityFlags=['fluorescence']
            ),
            volume=Volume(
                axesCalibrated=[True, True, True],
                axesCalibration=[0.652452890023035, 0.652452890023035, 1.0],
                axesInterpretation=(
                    <AxisInterpretation.distance: 'distance'>,
                    <AxisInterpretation.distance: 'distance'>,
                    <AxisInterpretation.distance: 'distance'>
                ),
                bitsPerComponentInMemory=16,
                bitsPerComponentSignificant=16,
                cameraTransformationMatrix=[-0.9998932296054086, -0.014612644841559427, 0.014612644841559427, -0.9998932296054086],
                componentCount=1,
                componentDataType='unsigned',
                voxelCount=[32, 32, 5],
                componentMaxima=[0.0],
                componentMinima=[0.0],
                pixelToStageTransformationMatrix=None
            )
        ),
        Channel(
            channel=ChannelMeta(name='Widefield Red', index=1, colorRGB=22015, emissionLambdaNm=620.0, excitationLambdaNm=None),
            loops=LoopIndices(NETimeLoop=None, TimeLoop=0, XYPosLoop=1, ZStackLoop=2),
            microscope=Microscope(
                objectiveMagnification=10.0,
                objectiveName='Plan Fluor 10x Ph1 DLL',
                objectiveNumericalAperture=0.3,
                zoomMagnification=1.0,
                immersionRefractiveIndex=1.0,
                projectiveMagnification=None,
                pinholeDiameterUm=None,
                modalityFlags=['fluorescence']
            ),
            volume=Volume(
                axesCalibrated=[True, True, True],
                axesCalibration=[0.652452890023035, 0.652452890023035, 1.0],
                axesInterpretation=(
                    <AxisInterpretation.distance: 'distance'>,
                    <AxisInterpretation.distance: 'distance'>,
                    <AxisInterpretation.distance: 'distance'>
                ),
                bitsPerComponentInMemory=16,
                bitsPerComponentSignificant=16,
                cameraTransformationMatrix=[-0.9998932296054086, -0.014612644841559427, 0.014612644841559427, -0.9998932296054086],
                componentCount=1,
                componentDataType='unsigned',
                voxelCount=[32, 32, 5],
                componentMaxima=[0.0],
                componentMinima=[0.0],
                pixelToStageTransformationMatrix=None
            )
        )
    ]
)
experiment
[
    TimeLoop(
        count=3,
        nestingLevel=0,
        parameters=TimeLoopParams(
            startMs=0.0,
            periodMs=1.0,
            durationMs=0.0,
            periodDiff=PeriodDiff(avg=16278.339965820312, max=16411.849853515625, min=16144.830078125)
        ),
        type='TimeLoop'
    ),
    XYPosLoop(
        count=4,
        nestingLevel=1,
        parameters=XYPosLoopParams(
            isSettingZ=True,
            points=[
                Position(stagePositionUm=[26950.2, -1801.6000000000001, 498.46000000000004], pfsOffset=None, name=None),
                Position(stagePositionUm=[31452.2, -1801.6000000000001, 670.7], pfsOffset=None, name=None),
                Position(stagePositionUm=[35234.3, 2116.4, 664.08], pfsOffset=None, name=None),
                Position(stagePositionUm=[40642.9, -3585.1000000000004, 555.12], pfsOffset=None, name=None)
            ]
        ),
        type='XYPosLoop'
    ),
    ZStackLoop(count=5, nestingLevel=2, parameters=ZStackLoopParams(homeIndex=2, stepUm=1.0, bottomToTop=True, deviceName='Ti2 ZDrive'), type='ZStackLoop')
]
text_info
{
    'capturing': 'Flash4.0, SN:101412\r\nSample 1:\r\n  Exposure: 100 ms\r\n  Binning: 1x1\r\n  Scan Mode: Fast\r\nSample 2:\r\n  Exposure: 100 ms\r\n  Binning: 1x1\r\n  Scan Mode: Fast',
    'date': '9/28/2021  9:41:27 AM',
    'description': 'Metadata:\r\nDimensions: T(3) x XY(4) x λ(2) x Z(5)\r\nCamera Name: Flash4.0, SN:101412\r\nNumerical Aperture: 0.3\r\nRefractive Index: 1\r\nNumber of Picture Planes: 2\r\nPlane #1:\r\n Name: Widefield Green\r\n Component Count: 1\r\n Modality: Widefield Fluorescence\r\n Camera Settings:   Exposure: 100 ms\r\n  Binning: 1x1\r\n  Scan Mode: Fast\r\n Microscope Settings:   Nikon Ti2, FilterChanger(Turret-Lo): 3 (FITC)\r\n  Nikon Ti2, Shutter(FL-Lo): Open\r\n  Nikon Ti2, Shutter(DIA LED): Closed\r\n  Nikon Ti2, Illuminator(DIA): Off\r\n  Nikon Ti2, Illuminator(DIA) Iris intensity: 3.0\r\n  Analyzer Slider: Extracted\r\n  Analyzer Cube: Extracted\r\n  Condenser: 1 (Shutter)\r\n  PFS, state: On\r\n  PFS, offset: 7959\r\n  PFS, mirror: Inserted\r\n  PFS, Dish Type: Glass\r\n  Zoom: 1.00x\r\n  Sola, Shutter(Sola): Active\r\n  Sola, Illuminator(Sola) Voltage: 100.0\r\nPlane #2:\r\n Name: Widefield Red\r\n Component Count: 1\r\n Modality: Widefield Fluorescence\r\n Camera Settings:   Exposure: 100 ms\r\n  Binning: 1x1\r\n  Scan Mode: Fast\r\n Microscope Settings:   Nikon Ti2, FilterChanger(Turret-Lo): 4 (TRITC)\r\n  Nikon Ti2, Shutter(FL-Lo): Open\r\n  Nikon Ti2, Shutter(DIA LED): Closed\r\n  Nikon Ti2, Illuminator(DIA): Off\r\n  Nikon Ti2, Illuminator(DIA) Iris intensity: 1.5\r\n  Analyzer Slider: Extracted\r\n  Analyzer Cube: Extracted\r\n  Condenser: 1 (Shutter)\r\n  PFS, state: On\r\n  PFS, offset: 7959\r\n  PFS, mirror: Inserted\r\n  PFS, Dish Type: Glass\r\n  Zoom: 1.00x\r\n  Sola, Shutter(Sola): Active\r\n  Sola, Illuminator(Sola) Voltage: 100.0\r\nTime Loop: 3\r\n- Equidistant (Period 1 ms)\r\nZ Stack Loop: 5\r\n- Step: 1 µm\r\n- Device: Ti2 ZDrive',
    'optics': 'Plan Fluor 10x Ph1 DLL'
}
custom_data

No attempt is made to parse this data. It will vary from file to file, but you may find something useful here:

{
    'StreamDataV1_0': {
        'Vector_StreamAnalogIn': '',
        'Vector_StreamDigitalIn': '',
        'Vector_AnalogIn': '',
        'Vector_DigitalIn': '',
        'Vector_Other': '',
        'Vector_StreamAnalogOut': '',
        'Vector_StreamDigitalOut': '',
        'Vector_AnalogOut': '',
        'Vector_DigitalOut': ''
    },
    'NDControlV1_0': {
        'NDControl': {
            'LoopState': {'no_name': [529, 529, 529, 529, 529]},
            'PlayFPS': {'no_name': [20.0, 20.0, 0.0, 20.0, 0.0]},
            'LoopSize': {'no_name': [3, 4, 0, 5, 0]},
            'LoopPosition': {'no_name': [2, 3, 0, 4, 0]},
            'LoopSelection': {'no_name': [b'AAAA', b'AAAAAA==', b'', b'AAAAAAA=', b'']},
            'LoopRangeSelection': {'no_name': [b'AQEB', b'AQEBAQ==', b'', b'AQEBAQE=', b'']},
            'LoopEventSelection': {'no_name': [b'AAAA', b'AAAAAA==', b'', b'AAAAAAA=', b'']},
            'FramesInRange': '',
            'LoopStep': {'no_name': [0, 0, 0, 0, 0]},
            'UserEventType': 2,
            'SelectionStyle': 0,
            'FramesBefore': 2,
            'FramesAfter': 1,
            'TimeBefore': 1.0,
            'TimeAfter': 1.0
        }
    },
    'LUTDataV1_0': {
        'ViewLut': True,
        'LutParam': {
            'Gradient': 0,
            'GradientBrightField': 0,
            'MinSrc': 0,
            'MaxSrc': 65535,
            'GammaSrc': 1.0,
            'MinDst': 0,
            'MaxDst': 65535,
            'ColorSpace': 4,
            'Representation': 0,
            'LutComponentCount': 2,
            'GroupCount': 1,
            'CompLutParam': {
                '00': {'MinSrc': [82, 0.0], 'MaxSrc': [113, 1.0], 'GammaSrc': 1.0, 'MinDst': 0, 'MaxDst': 65535, 'Group': 0},
                '01': {'MinSrc': [82, 0.0], 'MaxSrc': [114, 1.0], 'GammaSrc': 1.0, 'MinDst': 0, 'MaxDst': 65535, 'Group': 0},
                '02': {'MinSrc': [0, 0.0], 'MaxSrc': [65535, 1.0], 'GammaSrc': 1.0, 'MinDst': 0, 'MaxDst': 65535, 'Group': 0}
            },
            'LutDataSpectral': {
                'GainTrueColor': 1.0,
                'OffsetTrueColor': 0.0,
                'GainGrayScale': 1.0,
                'OffsetGrayScal': 0.0,
                'SpectralColorMode': 0,
                'Group00': {
                    'ColorGroup': 16711680,
                    'ColorCustom': 16711680,
                    'GainCustom': 1.0,
                    'OffsetCustom': 0.0,
                    'GainGrouped': 1.0,
                    'OffsetGrouped': 0.0
                }
            }
        },
        'EnableAutoContrast': True,
        'EnableAutoWhite': True,
        'AutoWhiteColor': 16777215,
        'RatioDesc': {
            'Numer': 0,
            'Denom': 1,
            'NumOffset': 0,
            'DenOffset': 0,
            'Min': 0.0,
            'Max': 2.0,
            'BkgndSize': 0,
            'Calibrated': True,
            'Cal.dKd': 224.0,
            'Cal.dVisc': 1.0,
            'Cal.dFmin': 255.0,
            'Cal.dFmax': 1.0,
            'Cal.dRmin': 0.0,
            'Cal.dRmax': 2.0,
            'Cal.dTMeasCalMin': 0.0,
            'Cal.dTMeasCalMax': 0.0,
            'PickFromGraph': True,
            'RatioViewEnabled': True
        },
        'GraphSelected': -1,
        'GraphVerticalSplit': True,
        'GrayGraph': True,
        'ShowAllComp': True,
        'ShowSpectralGraph': True,
        'GraphScale': 0,
        'GraphZoom00': 1.0,
        'GraphOffset00': 0.0,
        'GraphZoom01': 1.0,
        'GraphOffset01': 0.0,
        'GraphZoom02': 1.0,
        'GraphOffset02': 0.0
    },
    'GrabberCameraSettingsV1_0': {
        'GrabberCameraSettings': {
            'CameraUniqueName': 'Hamamatsu C11440-22C SN:101412',
            'CameraUserName': 'Flash4.0, SN:101412',
            'CameraFamilyName': 'ecmC11440_22C',
            'OverloadedUniqueName': '',
            'ModifiedAtJDN': 2459486.07103009,
            'FormatFast': {
                'Desc': {
                    'UniqueName': 'FMT 1x1 16',
                    'Interpretation': 1,
                    'FQModeUsage': 15,
                    'CanExecAsyncSampleGet': True,
                    'Fps': 30.00300030003,
                    'Sensitivity': 1.0,
                    'SensorPixels': {'cx': 2048, 'cy': 2044},
                    'SensorMicrons': {'cx': 13312, 'cy': 13286},
                    'SensorMin': {'cx': 4, 'cy': 4},
                    'SensorStep': {'cx': 2, 'cy': 2},
                    'BinningX': 1.0,
                    'BinningY': 1.0,
                    'SensorSource': {'left': 0, 'top': 0, 'right': 2048, 'bottom': 2044},
                    'FormatText': '16-bit - No Binning',
                    'FormatDesc': '16-bit - No Binning (30.0 FPS)',
                    'CamCorrReq': True,
                    'Comp': 1,
                    'Bpc': 16,
                    'UsageFlags': 1
                },
                'SensorUser': {'left': 512, 'top': 512, 'right': 544, 'bottom': 544}
            },
            'FormatQuality': {
                'Desc': {
                    'UniqueName': 'FMT 1x1 16',
                    'Interpretation': 1,
                    'FQModeUsage': 15,
                    'CanExecAsyncSampleGet': True,
                    'Fps': 30.00300030003,
                    'Sensitivity': 1.0,
                    'SensorPixels': {'cx': 2048, 'cy': 2044},
                    'SensorMicrons': {'cx': 13312, 'cy': 13286},
                    'SensorMin': {'cx': 4, 'cy': 4},
                    'SensorStep': {'cx': 2, 'cy': 2},
                    'BinningX': 1.0,
                    'BinningY': 1.0,
                    'SensorSource': {'left': 0, 'top': 0, 'right': 2048, 'bottom': 2044},
                    'FormatText': '16-bit - No Binning',
                    'FormatDesc': '16-bit - No Binning (30.0 FPS)',
                    'CamCorrReq': True,
                    'Comp': 1,
                    'Bpc': 16,
                    'UsageFlags': 1
                },
                'SensorUser': {'left': 512, 'top': 512, 'right': 544, 'bottom': 544}
            },
            'PropertiesFast': {
                'Exposure': 100.0,
                'LiveSpeedUp': 1,
                'CaptureQuality': 75,
                'CaptureMaxExposure': 10000.0,
                'QuantilRelative': True,
                'QuantilPromile': 0.1,
                'QuantilPixels': 100,
                'EnableAutoExposure': True,
                'ScanMode': 2,
                'Average': 1,
                'Integrate': 1,
                'AverageToQuality': 0.0,
                'AverageCH': '',
                'IntegrateCH': '',
                'AverageToQualityCH': '',
                'IntegrateToQualityCH': '',
                'FlexibleHeight': -1,
                'Negate': 0,
                'MultiExcitation': ''
            },
            'PropertiesFast_Extra': {'PropGroupCount': 0, 'PropGroupUsageArray': {}, 'PropGroupNameArray': {}},
            'PropertiesQuality': {
                'Exposure': 100.0,
                'LiveSpeedUp': 1,
                'CaptureQuality': 75,
                'CaptureMaxExposure': 10000.0,
                'QuantilRelative': True,
                'QuantilPromile': 0.1,
                'QuantilPixels': 100,
                'EnableAutoExposure': True,
                'ScanMode': 2,
                'Average': 1,
                'Integrate': 1,
                'AverageToQuality': 0.0,
                'AverageCH': '',
                'IntegrateCH': '',
                'AverageToQualityCH': '',
                'IntegrateToQualityCH': '',
                'FlexibleHeight': -1,
                'Negate': 0,
                'MultiExcitation': ''
            },
            'PropertiesQuality_Extra': {
                'PropGroupCount': 1,
                'PropGroupUsageArray': {'0': 0},
                'PropGroupNameArray': {'0': 'Use Stored ROI'}
            },
            'Metadata': {
                'Key': 'MV=0,TA=0,CH=1',
                'ChannelCount': 1,
                'Channels': {
                    'Channel_0': {
                        'Color': 22015,
                        'Name': 'Widefield Red',
                        'EmWavelength': 620.0,
                        'ChannelIsActive': True,
                        'ExWavelength': 540.5,
                        'MaxSaturatedValue': 4294967295
                    }
                }
            },
            'LightPath': {
                'TypeID': 0,
                'ExcitationSourceKey': 'LIGHT-EPI',
                'ExcitationSourceName': '',
                'EPIAdditionalFilterKey': '',
                'EPIAdditionalFilterName': '',
                'DIAAdditionalFilterKey': '',
                'DIAAdditionalFilterName': '',
                'LastEmissionFilterKey1': 'Turret-Lo',
                'LastEmissionFilterName1': 'Nikon Ti2, FilterChanger(Turret-Lo)',
                'SetColorManually': True,
                'MultiViewEnabled': True,
                'UpdateLPAutomatically': True
            },
            'ROI': {'Left': 512, 'Top': 512, 'Right': 544, 'Bottom': 544}
        },
        'GrabberCameraSettingsFQMode': 1
    },
    'CustomDataV2_0': {
        'CustomTagDescription_v1.0': {
            'Tag0': {'ID': 'Camera_ExposureTime1', 'Type': 3, 'Group': 2, 'Size': 60, 'Desc': 'Exposure Time', 'Unit': 'ms'},
            'Tag1': {'ID': 'PFS_OFFSET', 'Type': 2, 'Group': 1, 'Size': 60, 'Desc': 'PFS Offset', 'Unit': ''},
            'Tag2': {'ID': 'PFS_STATUS', 'Type': 2, 'Group': 1, 'Size': 60, 'Desc': 'PFS Status', 'Unit': ''},
            'Tag3': {'ID': 'X', 'Type': 3, 'Group': 1, 'Size': 60, 'Desc': 'X Coord', 'Unit': 'µm'},
            'Tag4': {'ID': 'Y', 'Type': 3, 'Group': 1, 'Size': 60, 'Desc': 'Y Coord', 'Unit': 'µm'},
            'Tag5': {'ID': 'Z', 'Type': 3, 'Group': 1, 'Size': 60, 'Desc': 'Z Coord', 'Unit': 'µm'},
            'Tag6': {'ID': 'Z1', 'Type': 3, 'Group': 1, 'Size': 60, 'Desc': 'Ti2 ZDrive', 'Unit': 'µm'}
        }
    },
    'AppInfo_V1_0': {
        'SWNameString': 'NIS-Elements AR',
        'GrabberString': 'Hamamatsu',
        'VersionString': '5.20.02 (Build 1453)',
        'CopyrightString': 'Copyright © 1991-2019  Laboratory Imaging,  http://www.lim.cz',
        'CompanyString': 'NIKON Corporation',
        'NFRString': ''
    },
    'AcqTimeV1_0': 2459486.07044662
}

alternatives

  • pims_nd2 - pims-based reader. ctypes wrapper around the v9.00 (2015) SDK
  • nd2reader - pims-based reader, using reverse-engineered file headers. mostly tested on NIS Elements 4.30.02
  • nd2file - another pure-python, chunk map reader, unmaintained?
  • pyND2SDK - windows-only cython wrapper around the v9.00 (2015) SDK. not on PyPI

The motivating factors for this library were:

  • support for as many nd2 files as possible, with a large test suite
  • pims-independent delayed reader based on dask
  • axis-associated metadata via xarray
  • combined approach of SDK and direct binary reads

Contributing / Development

To test locally and contribute. Clone this repo, then:

pip install -e .[dev]

To download sample data:

pip install requests
python scripts/download_samples.py

then run tests:

pytest

(and feel free to open an issue if that doesn't work!)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nd2-0.4.5.tar.gz (6.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

nd2-0.4.5-cp310-cp310-win_amd64.whl (763.3 kB view details)

Uploaded CPython 3.10Windows x86-64

nd2-0.4.5-cp310-cp310-manylinux_2_24_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64

nd2-0.4.5-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

nd2-0.4.5-cp310-cp310-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

nd2-0.4.5-cp39-cp39-win_amd64.whl (764.2 kB view details)

Uploaded CPython 3.9Windows x86-64

nd2-0.4.5-cp39-cp39-manylinux_2_24_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64

nd2-0.4.5-cp39-cp39-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

nd2-0.4.5-cp39-cp39-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

nd2-0.4.5-cp38-cp38-win_amd64.whl (764.6 kB view details)

Uploaded CPython 3.8Windows x86-64

nd2-0.4.5-cp38-cp38-manylinux_2_24_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ x86-64

nd2-0.4.5-cp38-cp38-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

nd2-0.4.5-cp38-cp38-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

nd2-0.4.5-cp37-cp37m-win_amd64.whl (763.0 kB view details)

Uploaded CPython 3.7mWindows x86-64

nd2-0.4.5-cp37-cp37m-manylinux_2_24_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.24+ x86-64

nd2-0.4.5-cp37-cp37m-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

File details

Details for the file nd2-0.4.5.tar.gz.

File metadata

  • Download URL: nd2-0.4.5.tar.gz
  • Upload date:
  • Size: 6.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5.tar.gz
Algorithm Hash digest
SHA256 139cad157ffd7b629b3a86f4ee0f08095296fba7dd108f4684c07b0093b272c8
MD5 c3f3738296263aaf27f2519a752d95b2
BLAKE2b-256 6f7cb65aeaf3dd4f64f465a76508730569dd7be3a70f19423319a6bcfbe0d4ff

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 763.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 38662e5936b91ee1d7b20672b0ff7da733543fe31cfd6fa7914ad89ee8aac6d1
MD5 7f10407b422147115fe6193e631b8d06
BLAKE2b-256 cb1ee992e14826cde98c1eda5e4507d2e8673c50ee6b0943e9bab11a87278389

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for nd2-0.4.5-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 473b1596c55dfb6084a5d33cb49fb0bca43a5f42a3fe609e378b474ade48f609
MD5 be6c7fabbf7ee9bd4577d58710438472
BLAKE2b-256 21f6557b1810bb6438eb24c8dabf26277a6f11784c10f213c2e54bfcc46a9a68

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nd2-0.4.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 31742a0f668e030af6547e5470f4770e297c7b01758ef450bdff824b3216751c
MD5 a50df1d3b23459954bb7859b045442bb
BLAKE2b-256 262892cae25ff4ecc82d604a8f1f5fc467edc497dcb47911541c743ca4fdba95

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nd2-0.4.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a3b1789f8ffbc4e32acfc105d0a897e8f0a240006d54648c9850caa8d42aaf77
MD5 afdbc03312d71aba19ebfd843ea03049
BLAKE2b-256 d50b93aa4b56fbe6bcea5b588cdaa85cc601f0b69434d8d66f92c2ee322baf8b

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 764.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7567d8841d0830df84274d50e74919db632c9fc67229c614194afc8be0fe5ae9
MD5 c91f89e0f90e866ec9bfec270f18c5a0
BLAKE2b-256 d394728662c0a83296c00ed260e0d534d359dcfeaa1d81c86015303aa62e8002

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp39-cp39-manylinux_2_24_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.9, manylinux: glibc 2.24+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 11cb043b2d0a0de182997c2bcacf27134e3626f09afe063e7d7ce521cc2e5961
MD5 29b9d5a51e31ccd734f125d0fba5f9b4
BLAKE2b-256 0a303782f0963c1702b47c49c059fcca1660679e3cd3b6b5dff69c4289e5851f

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8a09af4813d9ab7cda70ec041fcab26ffeba6b216a2fd855fd421839e8cfdba
MD5 55b364a3cf24fb42688a702e30ca4c8f
BLAKE2b-256 4a806c8c01e94c35031f72fe45cd9598fe239a65fb616937ff98c85b3ba79e6c

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4e5b942adbe0ef53f33cc4f39bcf79bd4d50a89cd648a1038279bf999c217799
MD5 3e472f59fbc2e68ecc64d231743b9284
BLAKE2b-256 2241b07a551ab6436976ce11e9c32d993acc614a9e8ca23e4dd4f5d6d246beb6

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 764.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e41d09bcae06753b4918f7462e0313117b101b040165467280a6dc51f7fd0238
MD5 80d18e708c5bcea270150eb12ce85ccb
BLAKE2b-256 1e5a4701965cd1f4cf3e771c8466aef271a79491a89bdbae29d3639aeae866a2

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp38-cp38-manylinux_2_24_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.8, manylinux: glibc 2.24+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 c85d924e4dfe1d47e6d689cff445e2027d7e97d36462fcd02b9889c1fb54f43e
MD5 019f325f82d7bc75e4c442291ab7e4ea
BLAKE2b-256 a29165c69fd00e370d976faa2118b282cef7a236861615c7a7ebdffd4f353083

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 42517077bc6e2e3613f73b514dfcf332c317204fa7e5c936d7ce32b6f47212a6
MD5 05517134cdf96ce60164465bde3e8fd8
BLAKE2b-256 1d9784d68462ebf8f50a300f935ec12332202073f279aa9c4e71f24d0e925a88

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2eef090a181c265dece73e5cee2ed311fe697c4b81223263dbf01c8bb6b150fc
MD5 3e09ab11c4239ed1ac75d50baec99be1
BLAKE2b-256 2eda901c4af68fa1a29f547c10b241468ce320b7b77adfd9224238a542924815

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 763.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6d6482bcfbd5a87f96f17022932b0608cfda7e8c75c52288bd6edda7e1e4541d
MD5 8fbb444fa39c44df9d23d64c121236ba
BLAKE2b-256 e8ba3592ba3a7032ab15a18b6e220d958d8410d6667b6ddda43dbdaa4d7358ef

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp37-cp37m-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for nd2-0.4.5-cp37-cp37m-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 981460bd6c9ae0e0b75ed9af012043f82f80b56f09bac08546b15d8a54e683c6
MD5 e44365dcf71d9343f034d2e5efe8f04b
BLAKE2b-256 be2ef72fd81a176918aef77c3126e314fd5698a0addefab9a2aeb2326d674f10

See more details on using hashes here.

File details

Details for the file nd2-0.4.5-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: nd2-0.4.5-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.14

File hashes

Hashes for nd2-0.4.5-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6bcec68a96710a4bd8b06b4786431dab4f9feb0708d44e571ff3e63fce8e4baf
MD5 22d72de91dbb110f6b8d8e1719c7b39e
BLAKE2b-256 ac5217410b6626cd0b06149ca9f95663c830d5b2da4627603fb24731ec4cb6b8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page