My final goal is to use a vectorized numpy solution for a for-loop. This loop creates for each element a random sample from another list if its elements are not given in the original element. However, the for-loops' input is a list of lists. I do not know how to apply a numpy vectorization for a list of lists. A reproducible example is here:
import random
list_of_all_items = [1, 2, 3, 4, 12, 21, 23, 42, 93]
seen_formats = [[1, 2, 3, 4], [2,23, 21, 3], [12, 42, 93, 1]]
not_seen_formats = []
for seen in seen_formats:
not_seen_formats.append(random.sample([format_ for format_ in list_of_all_items if format_ not in seen],
len(seen) * 1))
What I tried so far is:
import numpy as np
np.where(np.in1d(np.random.choice(list_of_all_items, 2, replace = False), np.asarray(seen_formats)))
>> (array([0, 1], dtype=int64),)
This sadly makes no sense. What I would like to have returned is an array which should contain random samples for the given list of lists, like:
>> array([[12, 21], # those numbers should be random numbers
[ 1, 4],
[ 2, 3]])
import numpy as np
np.random.seed(42)
list_of_all_items = np.array([1, 2, 3, 4, 12, 21, 23, 42, 93])
seen_formats = np.array([[1, 2, 3, 4], [2,23, 21, 3], [12, 42, 93, 1]])
print(list_of_all_items, '\n')
print(seen_formats, '\n')
def select(a, b):
return np.random.choice(a=np.setdiff1d(b, a), size=a.size, replace=False)
selection = np.apply_along_axis(func1d=select, axis=1, arr=seen_formats, b=list_of_all_items)
print(selection)
# Alternatively:
# select_vect = np.vectorize(select, excluded=['b'], signature='(m),(n)->(m)')
# selection2 = select_vect(seen_formats, list_of_all_items)
# print(selection2)
Output:
[ 1 2 3 4 12 21 23 42 93]
[[ 1 2 3 4]
[ 2 23 21 3]
[12 42 93 1]]
[[21 93 23 12]
[42 4 12 1]
[ 3 2 21 23]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With