Numpy数组变量避免了错误的计算

时间:2015-12-17 19:19:07

标签: python arrays numpy

我用幂律方程设置一个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

3 个答案:

答案 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

说明:

  1. 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]
  2. 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]])
>>>