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

标签 python arrays numpy scalar

我需要根据一维数组和标量的列表创建一个二维 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/

相关文章:

python - 使 numpy.savez 具有确定性

python - 使用 Django 管理命令的媒体位置错误

python - 递归地将子文件夹中的文件读取到列表中,并将每个子文件夹的文件合并到每个子文件夹的一个 csv 中

PHP - 声明一个全局数组

c# - 如何从数组中找到第 n 个重复项

numpy - 你如何利用 np.linalg.pinv 返回这个矩阵

python - query.connector 的值如何设置在 Django 代码中的 Q 对象中?

python - 同情。如何检查输入是数字、sympy 表达式以及如果是的话表达式中是否包含符号?

c++ - 来自 std::wstring 的 Asisgn LPCWSTR 数组

python - Numpy 数组插入第二个数组中的每隔一个元素