我用幂律方程设置一个numpy数组。问题是当x为负且n不是整数时,我的域的一部分尝试执行numpy.power(x,n)。在域的这一部分,我希望值为0.0。下面是一个具有正确行为的代码,但有更多的Pythonic方法吗?
# note mesh.x is a numpy array of length nx
myValues = npy.zeros((nx))
para = [5.8780046, 0.714285714, 2.819250868]
for j in range(nx):
if mesh.x[j] > para[1]:
myValues[j] = para[0]*npy.power(mesh.x[j]-para[1],para[2])
else:
myValues[j] = 0.0
答案 0 :(得分:1)
" numpythonic"一个字?应该是一个词。以下实际上既不是pythonic也不是unpythonic,但它比使用for
循环更有效,并且关闭(r)Travis可能会这样做:
import numpy
mesh_x = numpy.array([0.5,1.0,1.5])
myValues = numpy.zeros_like( mesh_x )
para = [5.8780046, 0.714285714, 2.819250868]
mask = mesh_x > para[1]
myValues[mask] = para[0] * numpy.power(mesh_x[mask] - para[1], para[2])
print(myValues)
对于非常大的问题,您可能希望避免创建临时数组:
mask = mesh.x > para[1]
myValues[mask] = mesh.x[mask]
myValues[mask] -= para[1]
myValues[mask] **= para[2]
myValues[mask] *= para[0]
答案 1 :(得分:1)
以下一种方法np.where
选择功效计算与q=ID:\[111%20TO%20999\]
之间的值 -
0
说明:
import numpy as np
np.where(mesh.x>para[1],para[0]*np.power(mesh.x-para[1],para[2]),0)
根据np.where(mask,A,B)
元素选择A或B中的元素。因此,在我们的情况下,在一次性对所有mask
元素进行矢量化比较时,它是mesh.x>para[1]
。mesh.x
为我们提供了掩码元素为para[0]*np.power(mesh.x-para[1],para[2])
时要选择的元素。否则,我们选择True
,这是0
的第三个参数。 答案 2 :(得分:0)
更多关于@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]])
>>>