Python 3.x 如何使用numpy广播、网格网格或其他方法创建字符矩阵

Python 3.x 如何使用numpy广播、网格网格或其他方法创建字符矩阵,python-3.x,numpy,matrix-multiplication,Python 3.x,Numpy,Matrix Multiplication,假设我有两个numpy阵列: a = np.array(['a','b']) b = np.array(['c','d']) 如何创建网格,如: ac | ad ------- bc | bd 我希望能够做到: a@b 或 np.meshgrid(a,b) 但两者都抛出类型异常 使用像矩阵积这样的运算符创建组合的有效方法是什么?Itertools.product是一种方法,但我更喜欢使用numpy。对于对象数据类型(而不是默认的U1),+是字符串连接: In [317]: a.astype(

假设我有两个numpy阵列:

a = np.array(['a','b'])
b = np.array(['c','d'])
如何创建网格,如:

ac | ad
-------
bc | bd
我希望能够做到:

a@b

np.meshgrid(a,b)

但两者都抛出类型异常

使用像矩阵积这样的运算符创建组合的有效方法是什么?Itertools.product是一种方法,但我更喜欢使用numpy。

对于对象数据类型(而不是默认的
U1
),
+
是字符串连接:

In [317]: a.astype(object)[:,None]+ b.astype(object)                                                         
Out[317]: 
array([['ac', 'ad'],
       ['bc', 'bd']], dtype=object)
因为这是工作对象数据类型数组,所以速度不如纯数字代码。它甚至可能比列表理解更慢

In [319]: np.array([[i+j for j in b] for i in a])                                                            
Out[319]: 
array([['ac', 'ad'],
       ['bc', 'bd']], dtype='<U2')
和纯列表版本:

In [322]: %%timeit A,B=a.tolist(), b.tolist() 
     ...: [[i+j for j in B] for i in A]                                                                                               
1.33 µs ± 13.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
char.add
虽然方便,但仍然依赖于字符串方法,因此速度不是更快:

In [324]: timeit np.char.add(a[:, None], b)                                                                  
15.6 µs ± 62.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
frompyfunc
带有
运算符。\uuuu add\uuuu
略优于列表理解:

In [331]: timeit np.frompyfunc(__add__,2,1)(a[:,None], b)                                                    
8.75 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
对于对象数据类型(而不是默认的
U1
),
+
是字符串连接:

In [317]: a.astype(object)[:,None]+ b.astype(object)                                                         
Out[317]: 
array([['ac', 'ad'],
       ['bc', 'bd']], dtype=object)
因为这是工作对象数据类型数组,所以速度不如纯数字代码。它甚至可能比列表理解更慢

In [319]: np.array([[i+j for j in b] for i in a])                                                            
Out[319]: 
array([['ac', 'ad'],
       ['bc', 'bd']], dtype='<U2')
和纯列表版本:

In [322]: %%timeit A,B=a.tolist(), b.tolist() 
     ...: [[i+j for j in B] for i in A]                                                                                               
1.33 µs ± 13.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
char.add
虽然方便,但仍然依赖于字符串方法,因此速度不是更快:

In [324]: timeit np.char.add(a[:, None], b)                                                                  
15.6 µs ± 62.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
frompyfunc
带有
运算符。\uuuu add\uuuu
略优于列表理解:

In [331]: timeit np.frompyfunc(__add__,2,1)(a[:,None], b)                                                    
8.75 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
这是


数组([['ac','ad'],
['bc','bd']],dtype='这是


数组([['ac','ad'],

['bc','bd']],dtype='确切的预期输出是什么?确切的预期输出是什么?