numpy 如何向数组中添加维度并使用一组相同的数据填充新维度

mlnl4t2r  于 2023-04-12  发布在  其他
关注(0)|答案(4)|浏览(191)

我有两个1D数组。我需要用第二个数组(B)中的所有行扩展第一个数组(a),以创建一个新数组,该数组是一个合并两个数组的1D数组。
下面的例子更清楚:

a = np.array(['x', 'y'])
b = np.array(['a', 'b', 'c'])
# how to handle the above 1D-arrays to create the below array (c)?
c = np.array(['xa', 'xb', 'xc', 'ya', 'yb', 'yc'])
print(c)

新的数组c看起来像这样:

['xa' 'xb' 'xc' 'ya' 'yb' 'yc']

当然,我可以用循环来实现,但我在寻找更聪明的代码。谢谢

wooyq4lh

wooyq4lh1#

对于两个列表,聪明的做法是使用列表解析:

In [234]: a = ['x', 'y']
     ...: b = ['a', 'b', 'c']
In [235]: [i+j for i in a for j in b]
Out[235]: ['xa', 'xb', 'xc', 'ya', 'yb', 'yc']

对于数组,您可以使用np.char.add,如其他答案所示:

In [236]: A=np.array(a); B=np.array(b)
In [237]: np.char.add(A[:,None],B)
Out[237]: 
array([['xa', 'xb', 'xc'],
       ['ya', 'yb', 'yc']], dtype='<U2')

Timeit在这样一个小例子上必须谨慎看待。通常情况下,对于小例子来说,for list更好,但扩展性不太好。但我预计np.char.add会损害数组的扩展性(np.char函数只是将标准的字符串方法应用于数组元素。)

In [238]: timeit np.char.add(A[:,None],B)
23.2 µs ± 57.4 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
In [239]: timeit [i+j for i in a for j in b]
1.55 µs ± 35.3 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

在创建数组时指定object dtype,我们可以使用+运算符,并获得一些速度:

In [240]: A=np.array(a,object); B=np.array(b,object)    
In [241]: A[:,None]+B
Out[241]: 
array([['xa', 'xb', 'xc'],
       ['ya', 'yb', 'yc']], dtype=object)    
In [242]: timeit A[:,None]+B
7.39 µs ± 76.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

作为参考,添加两个数字数组:

In [245]: %%timeit x=np.arange(2); y=np.arange(3)
     ...: x[:,None]+y
5.95 µs ± 8.71 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [246]: %%timeit x=np.arange(200); y=np.arange(300)
     ...: x[:,None]+y
100 µs ± 533 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

第二种情况大10_000,但时间仅增加20倍。

kmb7vmvb

kmb7vmvb2#

您可以使用numpy广播:

>>> np.char.add(a[:, None], b).ravel()
array(['xa', 'xb', 'xc', 'ya', 'yb', 'yc'], dtype='<U2')
drkbr07n

drkbr07n3#

使用numpy meshgrid方法,然后转置T

np.array([x+y for x, y in np.array(np.meshgrid(a, b)).T.reshape(-1,2)])

结果

array(['xa', 'xb', 'xc', 'ya', 'yb', 'yc'], dtype='<U2')
yxyvkwin

yxyvkwin4#

保持简单,使用两个循环结构

a = np.array(['x', 'y'])
b = np.array(['a', 'b', 'c'])

def find_combination(a, b):
    result = []
    for i in range(len(a)):
        for j in range(len(b)):
            result.append(a[i] + b[j])
    return result

print(find_combination(a, b))

相关问题