4.5. Array Logic¶

4.5.1. SetUp¶

>>> import numpy as np


4.5.2. Contains¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> 2 in a
True
>>>
>>> 0 in a
False
>>>
>>> [1, 2, 3] in a
True


4.5.3. Is In¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> b = np.array([1, 5, 9])
>>>
>>> np.isin(a, b)
array([[ True, False, False],
[False,  True, False]])


4.5.4. Scalar Comparison¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> a == 2
array([[False,  True, False],
[False, False, False]])
>>>
>>> a != 2
array([[ True, False,  True],
[ True,  True,  True]])
>>>
>>> a > 2
array([[False, False,  True],
[ True,  True,  True]])
>>>
>>> a >= 2
array([[False,  True,  True],
[ True,  True,  True]])
>>>
>>> a < 2
array([[ True, False, False],
[False, False, False]])
>>>
>>> a <= 2
array([[ True,  True, False],
[False, False, False]])


>>> import numpy as np
>>>
>>>
>>> a = np.array([1, 2, 3])
>>> b = np.array([3, 2, 1])
>>>
>>> a == b
array([False,  True, False])
>>>
>>> a != b
array([ True, False,  True])
>>>
>>> a > b
array([False, False,  True])
>>>
>>> a >= b
array([False,  True,  True])
>>>
>>> a < b
array([ True, False, False])
>>>
>>> a <= b
array([ True,  True, False])


4.5.6. Any¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([True, False, False])
>>>
>>> a.any()
True

>>> import numpy as np
>>>
>>>
>>> a = np.array([[True, False, False],
...               [True, True, True]])
>>>
>>> a.any()
True
>>>
>>> a.any(axis=0)
array([ True,  True,  True])
>>>
>>> a.any(axis=1)
array([ True,  True])


4.5.7. All¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([True, False, False])
>>>
>>> a.all()
False

>>> import numpy as np
>>>
>>>
>>> a = np.array([[True, False, False],
...               [True, True, True]])
>>>
>>> a.all()
False
>>>
>>> a.all(axis=0)
array([ True, False, False])
>>>
>>> a.all(axis=1)
array([False,  True])


4.5.8. Logical NOT¶

• np.logical_not(...)

• ~(...)

>>> import numpy as np
>>>
>>>
>>> a = np.array([[True, False, False],
...               [True, True, True]])
>>>
>>> np.logical_not(a)
array([[False,  True,  True],
[False, False, False]])
>>>
>>> ~a
array([[False,  True,  True],
[False, False, False]])

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> np.logical_not(a > 2)
array([[ True,  True, False],
[False, False, False]])
>>>
>>> ~(a > 2)
array([[ True,  True, False],
[False, False, False]])


4.5.9. Logical AND¶

• Meets first and second condition at the same time

• np.logical_and(..., ...)

• (...) & (...)

>>> import numpy as np
>>>
>>>
>>> a = np.array([True, False, False])
>>> b = np.array([True, True, False])
>>>
>>> np.logical_and(a, b)
array([ True, False, False])
>>>
>>> a & b
array([ True, False, False])

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> np.logical_and(a > 2, a < 5)
array([[False, False,  True],
[ True, False, False]])
>>>
>>> (a > 2) & (a < 5)
array([[False, False,  True],
[ True, False, False]])


4.5.10. Logical OR¶

• Meets first or second condition at the same time

• np.logical_or(..., ...)

• (...) | (...)

>>> import numpy as np
>>>
>>>
>>> a = np.array([True, False, False])
>>> b = np.array([True, True, False])
>>>
>>> np.logical_or(a, b)
array([ True,  True, False])
>>>
>>> a | b
array([ True,  True, False])

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> np.logical_or(a < 2, a > 4)
array([[ True, False, False],
[False,  True,  True]])
>>>
>>> (a < 2) | (a > 4)
array([[ True, False, False],
[False,  True,  True]])


4.5.11. Logical XOR¶

• Meets first or second condition, but not both at the same time

• np.logical_xor(..., ...)

• (...) ^ (...)

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>> np.logical_xor(a < 2, a > 4)
array([[ True, False, False],
[False,  True,  True]])
>>>
>>> (a < 2) ^ (a > 4)
array([[ True, False, False],
[False,  True,  True]])


4.5.12. Good Practices¶

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6]])
>>>
>>>
>>> (a < 2) & (a > 4) | (a == 3)
array([[False, False,  True],
[False, False, False]])

>>> import numpy as np
>>>
>>>
>>> a = np.array([[1, 2, 3],
...               [4, 5, 6],
...               [7, 8, 9]])
>>>
>>> lower = (a > 2)
>>> upper = (a < 6)
>>> nine = (a == 9)
>>> range = lower & upper
>>>
>>> lower & upper
array([[False, False,  True],
[ True,  True, False],
[False, False, False]])
>>>
>>> range | nine
array([[False, False,  True],
[ True,  True, False],
[False, False,  True]])
>>>
>>> lower & upper | nine
array([[False, False,  True],
[ True,  True, False],
[False, False,  True]])


4.5.13. Assignments¶

"""
* Assignment: Numpy Logic Even
* Complexity: easy
* Lines of code: 3 lines
* Time: 5 min

English:
1. Set random seed to zero
3. Check for even numbers of DATA which are less than 50 and save result to result
4. Check if all result matches this condition, result assing to result_all
5. Check if any result matches this condition, result assign to result_any
6. Run doctests - all must succeed

Polish:
1. Ustaw ziarno losowości na zero
3. Sprawdź parzyste elementy DATA, które są mniejsze od 50 i wynik zapisz do result
4. Sprawdź czy wszystkie result spełniają ten warunek, wynik zapisz do result_all
5. Sprawdź czy jakakolwiek result spełnia ten warunek, wynik zapisz do result_any
6. Uruchom doctesty - wszystkie muszą się powieść

Tests:
>>> import sys; sys.tracebacklimit = 0

>>> 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([ True, False, False, False, False, False, False, False,  True])

>>> result_all
False

>>> result_any
True
"""

import numpy as np
np.random.seed(0)

DATA = np.random.randint(0, 100, size=9)

result = ...
result_all = ...
result_any = ...


"""
* Assignment: Numpy Logic Isin
* Complexity: easy
* Lines of code: 3 lines
* Time: 5 min

English:
1. Set random seed to zero
2. Generate a: np.ndarray of 50 random integers from 0 to 100 (exclusive)
3. Generate b: np.ndarray with sequential powers of 2 and exponential from 0 to 6 (inclusive)
4. Check which elements from a are present in b
5. Result assign to result
6. Run doctests - all must succeed

Polish:
1. Ustaw ziarno losowości na zero
2. Wygeneruj a: np.ndarray z 50 losowymi liczbami całkowitymi od 0 do 100 (rozłącznie)
3. Wygeneruj b: np.ndarray z kolejnymi potęgami liczby 2, wykładnik od 0 do 6 (włącznie)
4. Sprawdź, które elementy z a są obecne w b
5. Wynik przypisz do result
6. Uruchom doctesty - wszystkie muszą się powieść

Tests:
>>> import sys; sys.tracebacklimit = 0

>>> 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([False, False,  True, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False,  True, False, False, False, False,
False, False, False, False, False,  True, False, False, False,
True, False, False, False, False])
"""

import numpy as np
np.random.seed(0)

result = ...