如何有效地为多个参数准备矩阵(二维数组)?

时间:2015-06-30 16:44:18

标签: numpy

如果要有效地评估多个参数的一维数组,即没有for循环,可以这样做:

x = array([1, 2, 3])
def gen_1d_arr(x):
    arr = array([2 + x, 2 - x,])
    return arr

gen_1d_arr(x).T

你得到:

array([[ 3,  1],
       [ 4,  0],
       [ 5, -1]])

好的,但你如何为二维数组做到这一点,如下所示:

def gen_2d_arr(x):
    arr = array([[2 + x, 2 - x,],
                 [2 * x, 2 / x]])
    return arr

获得这个?:

array([[[ 3.        ,  1.        ],
        [ 2.        ,  2.        ]],

       [[ 4.        ,  0.        ],
        [ 4.        ,  1.        ]],

       [[ 5.        , -1.        ],
        [ 6.        ,  0.66666667]]])

此外,这通常是否可用于n-d阵列?

1 个答案:

答案 0 :(得分:2)

看看你的功能是什么

In [274]: arr = np.array([[2 + x, 2 - x,],
                 [2 * x, 2 / x]])

In [275]: arr
Out[275]: 
array([[[ 3.        ,  4.        ,  5.        ],
        [ 1.        ,  0.        , -1.        ]],

       [[ 2.        ,  4.        ,  6.        ],
        [ 2.        ,  1.        ,  0.66666667]]])

In [276]: arr.shape
Out[276]: (2, 2, 3)

3来自x。中间的2来自[2+x, 2-x]对,而来自外部列表的第一个2

看起来你想要的是一个(3,2,2)数组。一种选择是将转置或轴交换应用于arr

arr.transpose([2,0,1])

np.array([arr1,arr2])的基本操作是构造一个前面有新维度的新数组,即形状(2, *arr1(shape))

还有其他组合数组的操作。 np.concatenate及其变体hstackvstackdstackcolumn_stack,加入数组。 .reshape()[None,...]atleast_nd等添加维度。查看stack函数的代码,了解如何使用这些工具组合数组。

关于效率问题,我的时间测试显示连接操作通常比np.array更快。通常np.array会将其输入转换为列表,并重新分析值。这使得它在将阵列转换为特定dtypes方面具有更强大的功能,但却牺牲了时间。但我只担心大型阵列的建设时间很长。