5.6. Indexing Select
5.6.1. Unique
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3, 1],
... [1, 4, 5, 6]])
>>>
>>> np.unique(a)
array([1, 2, 3, 4, 5, 6])
>>>
>>> np.unique(a, axis=0)
array([[1, 2, 3, 1],
[1, 4, 5, 6]])
>>>
>>> np.unique(a, axis=1)
array([[1, 1, 2, 3],
[1, 6, 4, 5]])
5.6.2. Diagonal
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2],
... [3, 4]])
>>>
>>> a.diagonal()
array([1, 4])
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
... [4, 5, 6]])
>>>
>>> a.diagonal()
array([1, 5])
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]])
>>>
>>> a.diagonal()
array([1, 5, 9])
5.6.3. Nonzero
Each element of the tuple contains one of the indices for each nonzero value.
Therefore, the length of each tuple element is the number of nonzeros in the array.
The first element of the tuple is the first index for each of the nonzero values: (
[0, 0, 1, 1]
).The second element of the tuple is the second index for each of the nonzero values: (
[0, 2, 0, 2]
).Pairs are zipped (first and second tuple):
0, 0
0, 2
1, 0
1, 2
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 0, 2],
... [3, 0, 4]])
>>>
>>> a.nonzero()
(array([0, 0, 1, 1]),
array([0, 2, 0, 2]))
>>>
>>> a[a.nonzero()]
array([1, 2, 3, 4])
5.6.4. Where
where(boolarray)
indexes of elements
>>> import numpy as np
Single argument:
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>>
>>> np.where(a != 2)
(array([0, 2, 3, 4, 5]),)
>>>
>>> np.where(a % 2 == 0)
(array([1, 3, 5]),)
>>>
>>> np.where( (a>2) & (a<5) )
(array([2, 3]),)
>>> a = np.array([[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]])
>>>
>>> np.where(a % 2 == 0)
(array([0, 1, 1, 2]),
array([1, 0, 2, 1]))
>>>
>>> np.where( (a>2) & (a<5) )
(array([0, 1]),
array([2, 0]))
5.6.5. Multiple argument
where(boolarray, truearray, falsearray)
:
>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]])
>>> np.where(a < 5, 'small', 'large')
array([['small', 'small', 'small'],
['small', 'large', 'large'],
['large', 'large', 'large']], dtype='<U5')
>>> np.where(a % 2 == 0, 'even', 'odd')
array([['odd', 'even', 'odd'],
['even', 'odd', 'even'],
['odd', 'even', 'odd']], dtype='<U4')
>>> np.where(a % 2 == 0, np.nan, a)
array([[ 1., nan, 3.],
[nan, 5., nan],
[ 7., nan, 9.]])
5.6.6. Take
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> at_index = np.array([0, 0, 1, 2, 2, 1])
>>>
>>> a.take(at_index)
array([1, 1, 2, 3, 3, 2])
>>> a = np.array([[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]])
>>>
>>> at_index = np.array([0, 0, 1])
>>>
>>> a.take(at_index, axis=0)
array([[1, 2, 3],
[1, 2, 3],
[4, 5, 6]])
>>>
>>> a.take(at_index, axis=1)
array([[1, 1, 2],
[4, 4, 5],
[7, 7, 8]])
5.6.7. Assignments
# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author
# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -v myfile.py`
# %% About
# - Name: Numpy Select Isin
# - Difficulty: easy
# - Lines: 6
# - Minutes: 5
# %% English
# 1. Set random seed to 0
# 2. Generate `a: np.ndarray` of size 50x50
# 3. `a` must contains random integers from 0 to 1024 inclusive
# 4. Create `result: np.ndarray` with elements selected from `a` which are power of two
# 5. Sort `result` in descending order
# 6. Run doctests - all must succeed
# %% Polish
# 1. Ustaw ziarno losowości na 0
# 2. Wygeneruj `a: np.ndarray` rozmiaru 50x50
# 3. `a` musi zawierać losowe liczby całkowite z zakresu od 0 do 1024 włącznie
# 4. Stwórz `result: np.ndarray` z elementami wybranymi z `a`, które są potęgami dwójki
# 5. Posortuj `result` w kolejności malejącej
# 6. Uruchom doctesty - wszystkie muszą się powieść
# %% Hints
# - `np.isin(a, b)`
# - `np.flip(a)`
# %% Tests
"""
>>> import sys; sys.tracebacklimit = 0
>>> assert sys.version_info >= (3, 9), \
'Python 3.9+ required'
>>> assert result is not Ellipsis, \
'Assign result to variable: `result`'
>>> assert type(result) is np.ndarray, \
'Variable `result` has invalid type, expected: np.ndarray'
>>> result
array([1024, 1024, 1024, 1024, 1024, 1024, 512, 512, 512, 512, 256,
256, 256, 256, 256, 128, 128, 128, 128, 128, 64, 32,
32, 32, 32, 32, 16, 16, 16, 16, 16, 16, 8,
8, 4, 2, 2, 2, 2, 2])
"""
import numpy as np
np.random.seed(0)
result = ...