def getitem_array1d_slice(context, builder, sig, args): aryty, _ = sig.args if aryty.ndim != 1: # TODO raise NotImplementedError("1D indexing into %dD array" % aryty.ndim) ary, idx = args arystty = make_array(aryty) ary = arystty(context, builder, value=ary) shapes = cgutils.unpack_tuple(builder, ary.shape, aryty.ndim) slicestruct = Slice(context, builder, value=idx) cgutils.normalize_slice(builder, slicestruct, shapes[0]) dataptr = cgutils.get_item_pointer(builder, aryty, ary, [slicestruct.start], wraparound=True) retstty = make_array(sig.return_type) retary = retstty(context, builder) shape = cgutils.get_range_from_slice(builder, slicestruct) retary.shape = cgutils.pack_array(builder, [shape]) stride = cgutils.get_strides_from_slice(builder, aryty.ndim, ary.strides, slicestruct, 0) retary.strides = cgutils.pack_array(builder, [stride]) retary.data = dataptr return retary._getvalue()
def getitem_array_tuple(context, builder, sig, args): aryty, idxty = sig.args ary, idx = args arystty = make_array(aryty) ary = arystty(context, builder, ary) ndim = aryty.ndim if isinstance(sig.return_type, types.Array): # Slicing raw_indices = cgutils.unpack_tuple(builder, idx, aryty.ndim) start = [] shapes = [] strides = [] oshapes = cgutils.unpack_tuple(builder, ary.shape, ndim) for ax, (indexval, idxty) in enumerate(zip(raw_indices, idxty)): if idxty == types.slice3_type: slice = Slice(context, builder, value=indexval) cgutils.normalize_slice(builder, slice, oshapes[ax]) start.append(slice.start) shapes.append(cgutils.get_range_from_slice(builder, slice)) strides.append( cgutils.get_strides_from_slice(builder, ndim, ary.strides, slice, ax)) else: ind = context.cast(builder, indexval, idxty, types.intp) start.append(ind) dataptr = cgutils.get_item_pointer( builder, aryty, ary, start, wraparound=context.metadata['wraparound']) # Build array retstty = make_array(sig.return_type) retary = retstty(context, builder) retary.data = dataptr retary.shape = cgutils.pack_array(builder, shapes) retary.strides = cgutils.pack_array(builder, strides) return retary._getvalue() else: # Indexing indices = cgutils.unpack_tuple(builder, idx, count=len(idxty)) indices = [ context.cast(builder, i, t, types.intp) for t, i in zip(idxty, indices) ] ptr = cgutils.get_item_pointer( builder, aryty, ary, indices, wraparound=context.metadata['wraparound']) return context.unpack_value(builder, aryty.dtype, ptr)
def getitem_array_unituple(context, builder, sig, args): aryty, idxty = sig.args ary, idx = args ndim = aryty.ndim arystty = make_array(aryty) ary = arystty(context, builder, ary) if idxty.dtype == types.slice3_type: # Slicing raw_slices = cgutils.unpack_tuple(builder, idx, aryty.ndim) slices = [Slice(context, builder, value=sl) for sl in raw_slices] for sl, sh in zip(slices, cgutils.unpack_tuple(builder, ary.shape, ndim)): cgutils.normalize_slice(builder, sl, sh) indices = [sl.start for sl in slices] dataptr = cgutils.get_item_pointer( builder, aryty, ary, indices, wraparound=context.metadata['wraparound']) # Build array retstty = make_array(sig.return_type) retary = retstty(context, builder) retary.data = dataptr shapes = [cgutils.get_range_from_slice(builder, sl) for sl in slices] retary.shape = cgutils.pack_array(builder, shapes) strides = [ cgutils.get_strides_from_slice(builder, ndim, ary.strides, sl, i) for i, sl in enumerate(slices) ] retary.strides = cgutils.pack_array(builder, strides) return retary._getvalue() else: # Indexing assert idxty.dtype == types.intp indices = cgutils.unpack_tuple(builder, idx, count=len(idxty)) indices = [ context.cast(builder, i, t, types.intp) for t, i in zip(idxty, indices) ] ptr = cgutils.get_item_pointer( builder, aryty, ary, indices, wraparound=context.metadata['wraparound']) return context.unpack_value(builder, aryty.dtype, ptr)
def getitem_array_tuple(context, builder, sig, args): aryty, idxty = sig.args ary, idx = args arystty = make_array(aryty) ary = arystty(context, builder, ary) ndim = aryty.ndim if isinstance(sig.return_type, types.Array): # Slicing raw_indices = cgutils.unpack_tuple(builder, idx, aryty.ndim) start = [] shapes = [] strides = [] oshapes = cgutils.unpack_tuple(builder, ary.shape, ndim) for ax, (indexval, idxty) in enumerate(zip(raw_indices, idxty)): if idxty == types.slice3_type: slice = Slice(context, builder, value=indexval) cgutils.normalize_slice(builder, slice, oshapes[ax]) start.append(slice.start) shapes.append(cgutils.get_range_from_slice(builder, slice)) strides.append(cgutils.get_strides_from_slice(builder, ndim, ary.strides, slice, ax)) else: ind = context.cast(builder, indexval, idxty, types.intp) start.append(ind) dataptr = cgutils.get_item_pointer(builder, aryty, ary, start, wraparound=True) # Build array retstty = make_array(sig.return_type) retary = retstty(context, builder) populate_array(retary, data=dataptr, shape=cgutils.pack_array(builder, shapes), strides=cgutils.pack_array(builder, strides), itemsize=ary.itemsize, meminfo=ary.meminfo, parent=ary.parent) return retary._getvalue() else: # Indexing indices = cgutils.unpack_tuple(builder, idx, count=len(idxty)) indices = [context.cast(builder, i, t, types.intp) for t, i in zip(idxty, indices)] ptr = cgutils.get_item_pointer(builder, aryty, ary, indices, wraparound=True) return context.unpack_value(builder, aryty.dtype, ptr)
def getitem_array_unituple(context, builder, sig, args): aryty, idxty = sig.args ary, idx = args ndim = aryty.ndim arystty = make_array(aryty) ary = arystty(context, builder, ary) if idxty.dtype == types.slice3_type: # Slicing raw_slices = cgutils.unpack_tuple(builder, idx, aryty.ndim) slices = [Slice(context, builder, value=sl) for sl in raw_slices] for sl, sh in zip(slices, cgutils.unpack_tuple(builder, ary.shape, ndim)): cgutils.normalize_slice(builder, sl, sh) indices = [sl.start for sl in slices] dataptr = cgutils.get_item_pointer(builder, aryty, ary, indices, wraparound=True) # Build array retstty = make_array(sig.return_type) retary = retstty(context, builder) shapes = [cgutils.get_range_from_slice(builder, sl) for sl in slices] strides = [cgutils.get_strides_from_slice(builder, ndim, ary.strides, sl, i) for i, sl in enumerate(slices)] populate_array(retary, data=dataptr, shape=cgutils.pack_array(builder, shapes), strides=cgutils.pack_array(builder, strides), itemsize=ary.itemsize, meminfo=ary.meminfo, parent=ary.parent) return retary._getvalue() else: # Indexing assert isinstance(idxty.dtype, types.Integer) indices = cgutils.unpack_tuple(builder, idx, count=len(idxty)) indices = [context.cast(builder, i, t, types.intp) for t, i in zip(idxty, indices)] ptr = cgutils.get_item_pointer(builder, aryty, ary, indices, wraparound=idxty.dtype.signed) return context.unpack_value(builder, aryty.dtype, ptr)