<p>这是我尝试过的-使用reduce,map。我不知道这有多快-但这是你想做的吗?在</p>
<p>编辑4:最简单、最易读的——使<code>l</code>成为一个numpy数组,然后极大地简化<code>where</code>。在</p>
<pre><code>import numpy as np
import time
l = np.array([1.0, 2.0, 3.0])
def posFunc(x,y):
return x*y
def negFunc(x,y):
return x*(y+1)
def myFunc(x, y):
if x > 0:
return posFunc(x, y)
if x < 0:
return negFunc(x, y)
else:
return 1.0
myArray = np.array([
[ 0.,0.,0.],
[ 0.32, -6.79, 0.],
[ 0.,0.,0.],
[ 0.,1.5,0.],
[ 0.,0., -1.71]])
t1 = time.time()
a = np.array([reduce(lambda x, (y,z): x*myFunc(z,l[y]), enumerate(x), 1) for x in myArray])
t2 = time.time()
print (t2-t1)*1000000
print a
</code></pre>
<p>基本上让我们看一下最后一行,它说的是将<code>enumerate(xx)</code>中的东西累加,从1开始(最后一个参数是<code>reduce</code>)。myFunc只接受myArray(row)中的元素和<code>l</code>中的element@index row,并根据需要将它们相乘。在</p>
<p>我的输出和你的不一样,所以我不确定这是否正是你想要的,但也许你可以遵循逻辑。在</p>
<p>我也不太确定这对大型阵列来说有多快。在</p>
<p>编辑:以下是一种“纯粹的裸体方式”来做到这一点。在</p>
^{pr2}$
<p>让我尽力解释<code>zip(*np.where(my != 0))</code>部分。<code>np.where</code>只返回两个numpy数组第一个数组是row的索引,第二个数组是与条件<code>(my != 0)</code>匹配的列的索引。我们获取这些索引的一个元组,然后使用<code>array.itemset</code>和<code>array.item</code>,谢天谢地,列索引对我们是免费的,所以我们可以在列表<code>l</code>中获取元素@that index。这应该比以前更快(而且可读的数量级!!)。需要<code>timeit</code>来确定它是否真的存在。在</p>
<p>编辑2:不必分别调用,因为一次调用就可以完成正反两次调用<code>np.where(my != 0)</code>。在</p>