Indexing and Assignment¶
Arkouda pdarray
objects support the same indexing and assignment syntax as rank-1 NumPy arrays.
Integer¶
Indexing and assigment with a single integer work the same as in Python.
>>> A = ak.arange(0, 10, 1)
>>> A[5]
5
>>> A[5] = 42
>>> A[5]
42
Slice¶
Indexing and assignment are also supported via Python-like slices. A Python slice has a start (inclusive), stop (exclusive), and stride. All three of these parameters can be implied; the default start is the beginning of the array (0 for positive strides, -1 for negative), the default stop is the end of the array (len
for positive strides, -1 for negative), and the default stride is 1.
>>> A = ak.arange(0, 10, 1)
>>> A[2:6]
array([2, 3, 4, 5])
>>> A[::2]
array([0, 2, 4, 6, 8])
>>> A[3::-1]
array([3, 2, 1, 0])
>>> A[1::2] = ak.zeros(5)
>>> A
array([0, 0, 2, 0, 4, 0, 6, 0, 8, 0])
Gather/Scatter (pdarray
)¶
Gather and scatter operations can be expressed using a pdarray
as an index to another pdarray
.
Integer pdarray
index¶
With an integer pdarray
, you can gather a list of indices from the target array. The indices can be out of order and non-unique. For assignment, the right-hand side must be a pdarray
the same size as the index array.
>>> A = ak.arange(10, 20, 1)
>>> inds = ak.array([8, 2, 5])
>>> A[inds]
array([18, 12, 15])
>>> A[inds] = ak.zeros(3)
>>> A
array([10, 11, 0, 13, 14, 0, 16, 17, 0, 19])
Logical indexing¶
Logical indexing is a powerful construct from NumPy (and Matlab). In logical indexing, the index must be a pdarray
of type bool
that is the same size as the outer pdarray
being indexed. The indexing only touches those elements of the outer pdarray
where the corresponding element of the index pdarray
is True
.
>>> A = ak.arange(0, 10, 1)
>>> inds = ak.zeros(10, dtype=ak.bool_)
>>> inds[2] = True
>>> inds[5] = True
>>> A[inds] # boolean-compression indexing yield values where inds is True
array([2, 5])
..
>>> A[inds] = 42 # boolean-expansion indexing with scalar sets values where inds is True
>>> A
array([0, 1, 42, 3, 4, 42, 6, 7, 8, 9])
..
>>> B = ak.arange(0, 10, 1)
>>> lim = 10//2
>>> B[B < lim] = B[:lim] * -1 # boolean-expansion indexing with array sets values where True
>>> B
array([0, -1, -2, -3, -4, 5, 6, 7, 8, 9])