np.apply_along_axis()函数似乎非常慢(15分钟后没有输出).有没有一种快速的方法在长阵列上执行此功能而无需并行化操作?我特别谈论有数百万个元素的数组.
这是我想要做的一个例子.请忽略my_func的简单定义,目标不是将数组乘以55(当然这可以在适当的位置完成),而是一个例子.在实践中,my_func稍微复杂一些,需要额外的参数,因此a的每个元素都被不同地修改,即不仅仅乘以55.
>>> def my_func(a):
... return a[0]*55
>>> a = np.ones((200000000,1))
>>> np.apply_along_axis(my_func, 1, a)
Run Code Online (Sandbox Code Playgroud)
编辑:
a = np.ones((20,1))
def my_func(a, i,j):
... b = np.zeros((2,2))
... b[0,0] = a[i]
... b[1,0] = a[i]
... b[0,1] = a[i]
... b[1,1] = a[j]
... return linalg.eigh(b)
>>> my_func(a,1,1)
(array([ 0., 2.]), array([[-0.70710678, 0.70710678],
[ 0.70710678, 0.70710678]]))
Run Code Online (Sandbox Code Playgroud) 如果我有一个函数,f(x)将一个1d数组作为参数并产生一个1d数组作为输出,我可以使用numpy.apply_along_axis将该函数应用于一行的二维数组X的每一行是f的有效参数.
现在我想用一个带两个参数的函数做类似的事情.例如,我有一个函数f(x,y),它将两个1d数组作为参数,我还有两个2d数组X,Y都有n行.我想对每对行应用f,产生一个又有n行的数组.
如何以有效的方式实现这一目标?
我也对变体感兴趣,其中f需要更多参数或涉及更高维数组:
例如,f可以取3个x,y,z形状的阵列(2,2); (3); (5,)并产生形状(4,4)的结果.
我有X,Y,Z形状(50,100,2,2); (50,100,3); (50,100,5)并想要一个形状的结果(50,100,4,4)
我有 2 个二维数组。我试图沿轴 1 进行卷积。np.convolve没有提供axis参数。这里的答案是,使用 1 个 2D 数组与 1D 数组进行卷积np.apply_along_axis。但它不能直接应用于我的用例。这里的问题没有答案。
MWE如下。
import numpy as np
a = np.random.randint(0, 5, (2, 5))
"""
a=
array([[4, 2, 0, 4, 3],
[2, 2, 2, 3, 1]])
"""
b = np.random.randint(0, 5, (2, 2))
"""
b=
array([[4, 3],
[4, 0]])
"""
# What I want
c = np.convolve(a, b, axis=1) # axis is not supported as an argument
"""
c=
array([[16, 20, 6, …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Python实现卷积神经网络.
但是,当我使用signal.convolve或np.convolve时,它不能对X,Y进行卷积(X是3d,Y是2d).X正在训练小型车.Y是过滤器.我不想为每个训练向量做循环,如:
for i in xrange(X.shape[2]):
result = signal.convolve(X[:,:,i], Y, 'valid')
....
Run Code Online (Sandbox Code Playgroud)
那么,有什么功能可以用来有效地进行卷积吗?