Mapping two numpy arrays

I have two arrays numpy A and B.

A = np.array ([[ 1  3] [ 2  3]  [ 2  1] ])

B = np.array([(1, 'Alpha'), (2, 'Beta'), (3, 'Gamma')]

How can I match A to B to get something like:

result = np.array ([[ 'Alpha'  'Gamma'] [ 'Beta'  'Gamma']  ['Beta'  'Alpha'] ])

I tried map(B['f1'],A), but I getTypeError: 'numpy.ndarray' object is not callable

+4
source share
4 answers

Here is a NumPythonicvector approach -

B[:,1][(A == B[:,0].astype(int)[:,None,None]).argmax(0)]

An example run in the general case is

In [118]: A
Out[118]: 
array([[4, 3],
       [2, 3],
       [2, 4]])

In [119]: B
Out[119]: 
array([['3', 'Alpha'],
       ['4', 'Beta'],
       ['2', 'Gamma']], 
      dtype='|S5')

In [120]: B[:,1][(A == B[:,0].astype(int)[:,None,None]).argmax(0)]
Out[120]: 
array([['Beta', 'Alpha'],
       ['Gamma', 'Alpha'],
       ['Gamma', 'Beta']], 
      dtype='|S5')
+1
source

You can use dictionary and list comprehension:

>>> d=dict(B)
>>> np.array([[(d[str(i)]),d[str(j)]] for i,j in A])
array([['Alpha', 'Gamma'],
       ['Beta', 'Gamma'],
       ['Beta', 'Alpha']], 
      dtype='|S5')
+2
source

Without using any specific numpy operations you can do:

d = dict(B)
[[d.get(str(y)) for y in x] for x in A]
+2
source

I assume you need a numpy solution for efficiency. In this case, try giving your association table a more "numpythonic" look:

A = np.array ([[ 1,  3], [ 2,  3] , [ 2,  1] ])
B = np.array([(0,'before'),(1, 'Alpha'), (2, 'Beta'), (3, 'Gamma')])
C=np.array([b[1] for b in B])

Then the result will be: C.take(A).

+1
source

Source: https://habr.com/ru/post/1611922/


All Articles