<p>我想这个裸体功能对你会有帮助</p>
<p><a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html" rel="nofollow">numpy.apply_along_axis</a></p>
<p>这里有一个实现。我还警告不要检查数组的和是否为0。由于机器精度限制,将浮点与0进行比较可能会产生意外的行为。如果你有-5和5,总和是零,我不确定这是你想要的。我使用numpy的any()函数查看是否有非零。为了简单起见,我还将您的列表(my_list)纳入全球范围。在</p>
<pre><code>import numpy as np
my_list = 1.1, 2., 3.4
def func_pos(val1, val2):
return val1 * val2
def func_neg(val1, val2):
return val1 *(val2 + 1)
def my_generator(row):
for i, a in enumerate(row):
if a > 0:
yield func_pos(a, my_list[i])
elif a < 0:
yield func_neg(a, my_list[i])
else:
yield 1
def reduce_row(row):
if not row.any():
return 1.0
else:
return np.prod(np.fromiter(my_generator(row), dtype=float))
def main():
myArray = np.array([
[ 0. , 0. , 0. ],
[ 0.32, -6.79, 0. ],
[ 0. , 0. , 0. ],
[ 0. , 1.5 , 0. ],
[ 0. , 0. , -1.71]])
return np.apply_along_axis(reduce_row, axis=1, arr=myArray)
</code></pre>
<p>有可能有更快的实现,我认为沿_轴应用_实际上只是一个隐藏的循环。在</p>
<p>我没有测试,但我敢打赌这比你刚开始的要快,而且内存效率应该更高。在</p>