gpt4 book ai didi

python - NumPy:来自数组和标量列表的二维数组

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:38 29 4
gpt4 key购买 nike

我需要根据一维数组和标量的列表创建一个二维 numpy 数组,以便复制标量以匹配一维数组的长度。

所需行为的示例

>>> x = np.ones(5)
>>> something([x, 0, x])
array([[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])

我知道列表的矢量元素总是具有相同的长度(形状),因此我可以通过执行以下操作“手动”完成:

def something(lst):
for e in lst:
if isinstance(e, np.ndarray):
l = len(e)
break
tmp = []
for e in lst:
if isinstance(e, np.ndarray):
tmp.append(e)
l = len(e)
else:
tmp.append(np.empty(l))
tmp[-1][:] = e
return np.array(tmp)

我想问的是,在 numpy 的某处是否隐藏了一些现成的解决方案,或者,如果没有,是否有比上述解决方案更好(例如,更通用、更可靠、更快)的解决方案。

最佳答案

In [179]: np.column_stack(np.broadcast(x, 0, x))
Out[179]:
array([[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])

In [187]: np.row_stack(np.broadcast_arrays(x, 0, x))
Out[187]:
array([[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])

使用 np.broadcastnp.broadcast_arrays 更快:

In [195]: %timeit np.column_stack(np.broadcast(*[x, 0, x]*10))
10000 loops, best of 3: 46.4 µs per loop

In [196]: %timeit np.row_stack(np.broadcast_arrays(*[x, 0, x]*10))
1000 loops, best of 3: 380 µs per loop

但比你的something函数慢:

In [201]: %timeit something([x, 0, x]*10)
10000 loops, best of 3: 37.3 µs per loop

注意np.broadcast最多可以传递32个数组:

In [199]: np.column_stack(np.broadcast(*[x, 0, x]*100))
ValueError: Need at least two and fewer than (32) array objects.

np.broadcast_arrays 是无限的:

In [198]: np.row_stack(np.broadcast_arrays(*[x, 0, x]*100))
Out[198]:
array([[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.],
...,
[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])

使用 np.broadcastnp.broadcast_arrays某事。它适用于不同(但可广播)形状的阵列,例如实例:

In [209]: np.column_stack(np.broadcast(*[np.atleast_2d(x), 0, x]))
Out[209]:
array([[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])

something([np.atleast_2d(x), 0, x]) 返回:

In [211]: something([np.atleast_2d(x), 0, x])
Out[211]:
array([array([[ 1., 1., 1., 1., 1.]]), array([ 0.]),
array([ 1., 1., 1., 1., 1.])], dtype=object)

关于python - NumPy:来自数组和标量列表的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244321/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com