Есть ли способ выполнить матричное умножение в Python, но элементы в матрице являются str, а не int

#python #arrays #numpy

Вопрос:

Вопрос:

Предположим, у меня есть вектор (массив) 5 x 1, и я хочу создать квадратную матрицу, вычислив A*A^T, которая должна выглядеть следующим образом:

 [[ 1  2  3  4  5],    
 [ 2  4  6  8 10],    
 [ 3  6  9 12 15],    
 [ 4  8 12 16 20],    
 [ 5 10 15 20 25]]
 

если массив является

[1, 2, 3, 4, 5]

Есть ли способ сделать то же самое, что и выше, но если значения в массиве являются строками, а не целыми числами? Так, например,

['a', 'e', 'i', 'o', 'u'] .

Ожидаемые результаты будут следующими

 [[ 'aa'  'ae'  'ai'  'ao'  'au'],    
 [ 'ea'  'ee'  'ei'  'eo'  'eu'],    
 [ 'ia'  'ie'  'ii'  'io'  'iu'],    
 [ 'oa'  'oe'  'oi'  'oo'  'ou'],    
 [ 'ua'  'ue'  'ui'  'uo'  'uu']]
 

Комментарии:

1. Каков ожидаемый результат?

2. np.tensordot есть несколько примеров работы с массивом строк типа dtype объекта. Но для строк astr*n (с целым числом n) является повторением и astr1 astr2 является соединением. Никакая другая «математика» для строк не определена.

3. @Corralien только что опубликовал ожидаемый результат

Ответ №1:

Для массива dtype объекта мы можем воспользоваться оператором сложения строк:

 In [204]: x = np.array(['a','b','c'], object)
In [205]: np.add.outer(x,x)
Out[205]: 
array([['aa', 'ab', 'ac'],
       ['ba', 'bb', 'bc'],
       ['ca', 'cb', 'cc']], dtype=object)
In [206]: x[:,None] x
Out[206]: 
array([['aa', 'ab', 'ac'],
       ['ba', 'bb', 'bc'],
       ['ca', 'cb', 'cc']], dtype=object)
 

Математика в массивах типов dtype объектов делегирует действие методам объектов. Таким образом, он ограничен собственными методами объекта. Для строк определяется простое сложение, как и умножение на целое число.