回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个numpy数组,它只有几个非零项,可以是正的,也可以是负的。E、 g.类似这样的事情:</p>
<pre><code>myArray = np.array([[ 0. , 0. , 0. ],
[ 0.32, -6.79, 0. ],
[ 0. , 0. , 0. ],
[ 0. , 1.5 , 0. ],
[ 0. , 0. , -1.71]])
</code></pre>
<p>最后,我希望收到一个列表,其中该列表的每个条目对应于myArray的一行,并且是依赖于myArray的相应行和另一个list的条目的函数输出的累积乘积(在下面的示例中,它被称为l)。
各个术语取决于myArray条目的符号:当它为正时,我应用“funPos”;当它为负时,我应用“funNeg”,如果条目为0,则该项将为1。因此,在上面的示例数组中,它将是:</p>
^{pr2}$
<p>我实现如下所示,它给了我想要的输出(注意:这只是一个高度简化的玩具示例;实际的矩阵要大得多,函数更复杂)。我遍历数组的每一行,如果行的和是0,我不需要做任何计算,输出就是1。如果它不等于0,我遍历这一行,检查每个值的符号并应用适当的函数。在</p>
<pre><code>import numpy as np
def doCalcOnArray(Array1, myList):
output = np.ones(Array1.shape[0]) #initialize output
for indRow,row in enumerate(Array1):
if sum(row) != 0: #only then calculations are needed
tempProd = 1. #initialize the product that corresponds to the row
for indCol, valCol in enumerate(row):
if valCol > 0:
tempVal = funPos(valCol, myList[indCol])
elif valCol < 0:
tempVal = funNeg(valCol, myList[indCol])
elif valCol == 0:
tempVal = 1
tempProd = tempProd*tempVal
output[indRow] = tempProd
return output
def funPos(val1,val2):
return val1*val2
def funNeg(val1,val2):
return val1*(val2+1)
myArray = np.array([[ 0. , 0. , 0. ],
[ 0.32, -6.79, 0. ],
[ 0. , 0. , 0. ],
[ 0. , 1.5 , 0. ],
[ 0. , 0. , -1.71]])
l = [1.1, 2., 3.4]
op = doCalcOnArray(myArray,l)
print op
</code></pre>
<p>输出是</p>
<pre><code>[ 1. -7.17024 1. 3. -7.524 ]
</code></pre>
<p>哪一个是理想的。<br/>
我的问题是,是否有一种更有效的方法来实现这一点,因为对于大型阵列来说,这是相当“昂贵”的。在</p>
<p>编辑:
我接受了Gabijit的回答,因为他提出的纯numpy解决方案似乎是我正在处理的阵列中最快的解决方案。请注意,RaJa也有一个很好的工作解决方案,需要panda和dave的解决方案很好地工作,可以作为一个很好的例子,如何使用发电机和numpy的“沿_轴应用”。在</p>