python-3.x 创建垂直2D numpy数组

brccelvz  于 2023-04-22  发布在  Python
关注(0)|答案(2)|浏览(78)
first_name = [["Tom", "Alex", "Sam"], ["Anna", "Bob", "Mike"]] 
last_name = [["Smith", "Brown", "Lee"], ["Davis", "Allen", "Lewis"]]

我想创建一个****垂直numpy数组,输出如下:

[["Tom Smith"    "Anna Davis"]
 ["Alex Brown"   "Bob Allen"]
 ["Sam Lee"     "Mike Lewis"]]

我该怎么做?

eqzww0vc

eqzww0vc1#

尝试:

out = np.array([[f'{c} {d}' for c, d in zip(a, b)] for a, b in zip(first_name, last_name)]).T
print(out)

图纸:

[['Tom Smith' 'Anna Davis']
 ['Alex Brown' 'Bob Allen']
 ['Sam Lee' 'Mike Lewis']]
ffscu2ro

ffscu2ro2#

使用double list comprehension,我们可以连接所有对:

In [4]: [' '.join([k,l]) for i,j in zip(first_name, last_name) for k,l in zip(i,j)]
Out[4]: ['Tom Smith', 'Alex Brown', 'Sam Lee', 'Anna Davis', 'Bob Allen', 'Mike Lewis']

但是你想要嵌套列表:

In [5]: [[' '.join([k,l]) for k,l in zip(i,j)] for i,j in zip(first_name, last_name)]
Out[5]: 
[['Tom Smith', 'Alex Brown', 'Sam Lee'],
 ['Anna Davis', 'Bob Allen', 'Mike Lewis']]

顺序是错误的,所以我们可以应用一个等价于转置的列表:

In [6]: list(zip(*_))
Out[6]: 
[('Tom Smith', 'Anna Davis'),
 ('Alex Brown', 'Bob Allen'),
 ('Sam Lee', 'Mike Lewis')]

我还没有找到一种方法将“转置”移动到双循环中。
numpy有一些np.char函数,它们将字符串方法应用于数组的元素。

In [24]: np.char.add(np.char.add(first_name, ' '),last_name).T
Out[24]: 
array([['Tom Smith', 'Anna Davis'],
       ['Alex Brown', 'Bob Allen'],
       ['Sam Lee', 'Mike Lewis']], dtype='<U10')

在这里我使用np.char.add来添加两个数组(或列表变成数组)的元素。我必须首先向一个数组添加一个空格,然后添加另一个。和以前一样,我们需要转置。
这实际上看起来更简单,但我不确定它是否更快。
或者通过创建对象dtype数组,我们可以使用'+'运算符:

In [27]: (np.array(first_name, object)+np.array(' ',object)+np.array(last_name,object)).T
Out[27]: 
array([['Tom Smith', 'Anna Davis'],
       ['Alex Brown', 'Bob Allen'],
       ['Sam Lee', 'Mike Lewis']], dtype=object)

列表理解的时间最快,但是对于这样的小例子,时间必须谨慎对待。不同的方法可能会有不同的规模。

In [31]: timeit list(zip(*[[' '.join([k,l]) for k,l in zip(i,j)] for i,j in zip(
    ...: first_name, last_name)]))
4.17 µs ± 142 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [32]: timeit np.char.add(np.char.add(first_name, ' '),last_name).T
39.5 µs ± 780 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [33]: timeit (np.array(first_name, object)+np.array(' ',object)+np.array(last
    ...: _name,object)).T
9.74 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相关问题