Логическое умножение матриц в питоне - PullRequest
0 голосов
/ 05 июля 2018

У меня есть матрица A и вектор B , где матрица A заполнена 0 's и 1 и вектор B заполнен строками. Я хочу выполнить следующую операцию:

A = np.array([[1,1,0],[0,1,1],[0,0,1]])
B = np.array(['a','b','c'])

и результат должен быть:

R = np.array(['a'+'b', 'b'+'c', 'c'])

Можно ли сделать это с numpy?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Есть способ, если вы определите свой массив b с помощью dtype = object:

b = np.array(['a', 'b', 'c'], dtype=object)

Тогда это просто dot продукт:

a.dot(b)
#array(['ab', 'bc', 'c'], dtype=object)
0 голосов
/ 05 июля 2018

На самом деле да, есть способ использовать NumPy. Используйте numpy.where:

import numpy as np

A = np.array([[1,1,0],[0,1,1],[0,0,1]])
B = np.array(['a','b','c'])

R = np.where(A,B,'')

print(R)
[['a' 'b' '']
 ['' 'b' 'c']
 ['' '' 'c']]

R.astype(object).sum(axis=1)
['ab', 'bc', 'c']
0 голосов
/ 05 июля 2018

Лучшее, что я мог придумать, это:

def np_add_charrarays(*arrays):
    """Concatenate n char arrays together with n > 2"""
    res = np.core.defchararray.add(*arrays[:2])
    for arr in arrays[2:]:
        res = np.core.defchararray.add(res, arr)
    return res

np_add_charrarays(*np.core.defchararray.multiply(B, A).T)

# output: array(['ab', 'bc', 'c'], dtype='<U3')

Я не совсем уверен, будет ли он быстрее стандартного pure python. Помоги себе с некоторыми timeit с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...