---
title: BNNSNDArrayDescriptor
framework: accelerate
role: symbol
role_heading: Structure
path: accelerate/bnnsndarraydescriptor
---

# BNNSNDArrayDescriptor

A structure that describes the shape, stride, data type, and, optionally, the memory location of an n-dimensional array.

## Declaration

```swift
struct BNNSNDArrayDescriptor
```

## Overview

Overview You use a BNNSNDArrayDescriptor structure as the primary mechanism to pass the description of data to and from BNNS functions. The description may include a pointer to the memory location. For example, use the following code when you’re passing immutable weights to a convolution layer: let weights: [Float] = [ ... ]

weights.withUnsafeBufferPointer { weightsPtr in          let weightsDescriptor = BNNSNDArrayDescriptor(flags: BNNSNDArrayFlags(0),                                                   layout: BNNSDataLayoutConvolutionWeightsOIHW,                                                   size: (3, 3, 1, 1, 0, 0, 0, 0),                                                   stride: (0, 0, 0, 0, 0, 0, 0, 0),                                                   data: UnsafeMutableRawPointer(mutating: weightsPtr.baseAddress!),                                                   data_type: .float,                                                   table_data: nil,                                                   table_data_type: .float,                                                   data_scale: 1,                                                   data_bias: 0)

// Create and apply convolution layer.

} Setting a stride value of 0 indicates that BNNS calculates stride, without padding, for that axis. For example, the stride for both of the following n-dimensional array descriptors is the same: let inputDescriptor = BNNSNDArrayDescriptor(flags: flags,                                            layout: BNNSDataLayoutRowMajorMatrix,                                            size: (3, 3, 0, 0, 0, 0, 0, 0),                                            stride: (0, 0, 0, 0, 0, 0, 0, 0),                                            data: nil,                                            data_type: .float,                                            table_data: nil,                                            table_data_type: .float,                                            data_scale: 1,                                            data_bias: 0)

let inputDescriptor = BNNSNDArrayDescriptor(flags: flags,                                            layout: BNNSDataLayoutRowMajorMatrix,                                            size: (3, 3, 0, 0, 0, 0, 0, 0),                                            stride: (1, 3, 0, 0, 0, 0, 0, 0),                                            data: nil,                                            data_type: .float,                                            table_data: nil,                                            table_data_type: .float,                                            data_scale: 1,                                            data_bias: 0) You don’t need to specify the data when, for example, you’re passing that data directly to BNNSFilterApplyBatch(_:_:_:_:_:_:). The following code creates BNNSNDArrayDescriptor structures for the input and output of a convolution operation. The data property of both descriptors is nil, and the input and output data are passed directly to BNNSFilterApplyBatch(_:_:_:_:_:_:): let input: [Float] = [ ... ] var output: [Float] = [ ... ]

let inDescriptor = BNNSNDArrayDescriptor(flags: BNNSNDArrayFlags(0),                                          layout: BNNSDataLayoutImageCHW,                                          size: (6, 6, 1, 0, 0, 0, 0, 0),                                          stride: (0, 0, 0, 0, 0, 0, 0, 0),                                          data: nil,                                          data_type: .float,                                          table_data: nil,                                          table_data_type: .float,                                          data_scale: 1,                                          data_bias: 0)

let outDescriptor = BNNSNDArrayDescriptor(flags: BNNSNDArrayFlags(0),                                           layout: BNNSDataLayoutImageCHW,                                           size: (4, 4, 1, 0, 0, 0, 0, 0),                                           stride: (0, 0, 0, 0, 0, 0, 0, 0),                                           data: nil,                                           data_type: .float,                                           table_data: nil,                                           table_data_type: .float,                                           data_scale: 1,                                           data_bias: 0)

var parameters = BNNSLayerParametersConvolution(i_desc: inDescriptor,                                                 w_desc: weightsDescriptor,                                                 o_desc: outDescriptor,                                                 bias: biasDescriptor,                                                 activation: .identity,                                                 x_stride: 1, y_stride: 1,                                                 x_dilation_stride: 0, y_dilation_stride: 0,                                                 x_padding: 0, y_padding: 0,                                                 groups: 1,                                                 pad: (0, 0, 0, 0))

// `convolutionLayer` is a `BNNSFilter` created by `BNNSFilterCreateLayerConvolution` using `parameters`.

let error = BNNSFilterApplyBatch(convolutionLayer, 1,                                  input, inStride,                                  &output, outStride)

## Topics

### Creating an Array Descriptor

- [init(flags:layout:size:stride:data:data_type:table_data:table_data_type:data_scale:data_bias:)](accelerate/bnnsndarraydescriptor/init(flags:layout:size:stride:data:data_type:table_data:table_data_type:data_scale:data_bias:).md)
- [init(data:scalarType:shape:)](accelerate/bnnsndarraydescriptor/init(data:scalartype:shape:).md)
- [init(data:shape:)](accelerate/bnnsndarraydescriptor/init(data:shape:).md)
- [init(dataType:shape:)](accelerate/bnnsndarraydescriptor/init(datatype:shape:).md)
- [init()](accelerate/bnnsndarraydescriptor/init().md)

### Specifying the Behavior of an N-Dimensional Array.

- [BNNSNDArrayFlags](accelerate/bnnsndarrayflags.md)

### Accessing the Properties of an Array Descriptor

- [flags](accelerate/bnnsndarraydescriptor/flags.md)
- [layout](accelerate/bnnsndarraydescriptor/layout.md)
- [size](accelerate/bnnsndarraydescriptor/size.md)
- [stride](accelerate/bnnsndarraydescriptor/stride.md)
- [data](accelerate/bnnsndarraydescriptor/data.md)
- [data_type](accelerate/bnnsndarraydescriptor/data_type.md)
- [table_data](accelerate/bnnsndarraydescriptor/table_data.md)
- [table_data_type](accelerate/bnnsndarraydescriptor/table_data_type.md)
- [data_scale](accelerate/bnnsndarraydescriptor/data_scale.md)
- [data_bias](accelerate/bnnsndarraydescriptor/data_bias.md)
- [shape](accelerate/bnnsndarraydescriptor/shape.md)

### Allocating and Deallocating Memory

- [allocate(initializingFrom:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(initializingfrom:shape:batchsize:).md)
- [allocate(randomUniformUsing:range:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomuniformusing:range:shape:batchsize:)-2rorb.md)
- [allocate(randomUniformUsing:range:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomuniformusing:range:shape:batchsize:)-761hg.md)
- [allocate(randomIn:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomin:shape:batchsize:)-1697a.md)
- [allocate(randomIn:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomin:shape:batchsize:)-5a2p2.md)
- [allocate(randomIn:using:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomin:using:shape:batchsize:)-5kbi8.md)
- [allocate(randomIn:using:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomin:using:shape:batchsize:)-3w6ig.md)
- [allocate(repeating:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(repeating:shape:batchsize:).md)
- [allocateUninitialized(scalarType:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocateuninitialized(scalartype:shape:batchsize:).md)
- [deallocate()](accelerate/bnnsndarraydescriptor/deallocate().md)

### Generating an Array from an Array Descriptor’s Data

- [makeArray(of:batchSize:)](accelerate/bnnsndarraydescriptor/makearray(of:batchsize:).md)

### Initializers

- [init(data:scalarType:shape:batchSize:)](accelerate/bnnsndarraydescriptor/init(data:scalartype:shape:batchsize:).md)
- [init(data:shape:batchSize:)](accelerate/bnnsndarraydescriptor/init(data:shape:batchsize:).md)

### Instance Properties

- [dataSize](accelerate/bnnsndarraydescriptor/datasize.md)

### Type Methods

- [allocate(randomNormalUsing:mean:standardDeviation:shape:batchSize:)](accelerate/bnnsndarraydescriptor/allocate(randomnormalusing:mean:standarddeviation:shape:batchsize:).md)

## Relationships

### Conforms To

- [BitwiseCopyable](swift/bitwisecopyable.md)

## See Also

### N-dimensional array descriptor essentials

- [BNNSLayerData](accelerate/bnnslayerdata.md)
- [BNNS.Shape](accelerate/bnns/shape.md)
- [BNNSDataLayout](accelerate/bnnsdatalayout.md)
- [BNNSDataType](accelerate/bnnsdatatype.md)
- [BNNSDataLayoutGetRank(_:)](accelerate/bnnsdatalayoutgetrank(_:).md)
