在numpy矩阵行中应用函数并连接结果?

时间:2015-04-28 19:02:06

标签: python numpy matrix

我尝试使用numpy.apply_along_axis,但这似乎仅在应用函数折叠维度而不是展开维度时才有效。

示例:

def dup(x):
    return np.array([x, x])
a = np.array([1,2,3])
np.apply_along_axis(dup, axis=0, arr=a) # This doesn't work

我期待下面的矩阵(注意它的尺寸是如何从输入矩阵a扩展的):

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

在R中,这可以通过**ply包中的plyr函数集来完成。如何使用numpy

3 个答案:

答案 0 :(得分:1)

如果您只想重复这些元素,可以使用np.repeat

>>> np.repeat(a,2).reshape(3,2)
array([[1, 1],
       [2, 2],
       [3, 3]])

要使用函数np.frompyfunc并使用np.vstack转换为集成数组:

>>> def dup(x):
...     return np.array([x, x])
>>> oct_array = np.frompyfunc(dup, 1, 1)
>>> oct_array(a)
array([array([1, 1]), array([2, 2]), array([3, 3])], dtype=object)
>>> np.vstack(oct_array(a))
array([[1, 1],
       [2, 2],
       [3, 3]])

答案 1 :(得分:1)

对于习惯于常规Python代码的人来说,列表理解可能是最简单的方法:

In [20]: np.array([dup(x) for x in a])
Out[20]: 
array([[1, 1],
       [2, 2],
       [3, 3]])

理解(将dup应用于a的每个元素的循环或映射)返回[array([1, 1]), array([2, 2]), array([3, 3])],这很容易变成带有np.array()的二维数组。< / p>

至少对于这个小a,它也比np.frompyfunc方法快。 np.frompyfunc函数可以完全访问广播,但显然它不适用任何快速迭代技巧。

在处理多个维度时,

apply_along_axis可以帮助保持指数直线,但它仍然只是一种迭代方法。它是Python编写的,因此您可以自己研究它的代码。对于这个简单的案例,它要比复杂得多。

答案 2 :(得分:0)

为了使您的示例按预期工作,a应该是二维的:

def dup(x):
    # x is now an array of size 1
    return np.array([ x[0], x[0] ])
a = np.array([[1,2,3]])  # 2dim
np.apply_along_axis(dup, axis=0, arr=a)
=> 
array([[1, 2, 3],
       [1, 2, 3]])

当然,您可能想要转置结果。