我尝试使用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
?
答案 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]])
当然,您可能想要转置结果。