更多的解釋@jez和@Divakar給出的答案與簡單的例子比答案本身。他們都依靠某種形式的boolean indexing。
>>>
>>> a
array([[-4.5, -3.5, -2.5],
[-1.5, -0.5, 0.5],
[ 1.5, 2.5, 3.5]])
>>> n = 2.2
>>> a ** n
array([[ nan, nan, nan],
[ nan, nan, 0.21763764],
[ 2.44006149, 7.50702771, 15.73800567]])
np.where
爲此,它根據布爾數組選擇兩個值之一。
>>> np.where(np.isnan(a**n), 0, a**n)
array([[ 0. , 0. , 0. ],
[ 0. , 0. , 0.21763764],
[ 2.44006149, 7.50702771, 15.73800567]])
>>>
>>> b = np.where(a < 0, 0, a)
>>> b
array([[ 0. , 0. , 0. ],
[ 0. , 0. , 0.5],
[ 1.5, 2.5, 3.5]])
>>> b **n
array([[ 0. , 0. , 0. ],
[ 0. , 0. , 0.21763764],
[ 2.44006149, 7.50702771, 15.73800567]])
在左手側使用布爾索引和右手邊。這與np.where
>>>
>>> a[a >= 0] = a[a >= 0] ** n
>>> a
array([[ -4.5 , -3.5 , -2.5 ],
[ -1.5 , -0.5 , 0.21763764],
[ 2.44006149, 7.50702771, 15.73800567]])
>>> a[a < 0] = 0
>>> a
array([[ 0. , 0. , 0. ],
[ 0. , 0. , 0.21763764],
[ 2.44006149, 7.50702771, 15.73800567]])
>>>
第一個剪輯引發異常。回溯(最近一次調用最後一次): 文件「C:\ Users \ choutman \ Documents \ confocal beads \ Modeling \ Carl_1D_coupled_time.py」,line 85,in myValues [mask] = para [0] * npy.power文件「C:\ Python27 \ lib \ site-packages \ fipy \ variables \ unaryOperatorVariable.py」,第67行,在_calcValue_ 中的文件:mesh.x [mask] - para [1],para [2]){{clip}返回self.op(self.var [0] .value) 文件「C:\ Python27 \ lib \ site-packages \ fipy \ variables \ variable.py」,行1572,在 return self._UnaryOperatorVariable(lambda a :a [index], IndexError:不支持的迭代器索引 –
我不能複製你的問題我編輯了我的答案,包括一個完整的例子,如果你的'mesh.x'不是一個標準的' numpy.array',而是一個'matr ix'或其他派生類 - 可以這樣嗎?如果是這樣,也許可以說'mask =(numpy.asarray(mesh.x)> para [1])'是安全的。 – jez
是的,確切地說。 mesh.x是從FiPy派生的類。當我按照你的建議將它作爲一個numpy數組轉換時,它可以正常工作。謝謝。 –