您可以在Python中使用大括号内的if-else语句来获取数组吗?

Lou*_*Lou 1 python arrays if-statement numpy

我想知道是否有一种很好的方法可以在Python中使用数组大括号内的if-else语句来分配值.我想要的是:

A = #some 2D array of length m by n, already initialized
A = np.float64(A)
val = someValue #any number, pick a number

A = [[val for j in range(n) if A[i][j] < val, else A[i][j]=A[i][j]] for i in range(m)]
Run Code Online (Sandbox Code Playgroud)

有一个很好的方法来做到这一点?或者,如果numpy有一个更快的计算方法,即使不是更好,也会同样好.

做我想要实现的目标的时间越长,就越像

for i in range(m):
    for j in range(n):
        if A[i][j] < val:
            A[i][j] = val
Run Code Online (Sandbox Code Playgroud)

所需的输出是将低于阈值的任何值设置为该阈值.我可以使用一维数组做更简单的if语句,例如

myArray = [otherArray[i] for i in range(theRange) if otherArray[i]>=value and otherArray[i]<=anotherValue]
Run Code Online (Sandbox Code Playgroud)

这个一维例子不是我想要的.这只是我正在寻找的编码块类型的一个例子.处理传统的if-else语句似乎更快.

Bre*_*bel 6

Python 的单行三元运算符语法如下所示

variable = a if CONDITION else b
Run Code Online (Sandbox Code Playgroud)

您也可以将其放在列表理解中。目前尚不清楚val您的示例中的内容,但我假设它是您事先指定的值。

val = 2
A = [[val if A[i][j] < val else A[i][j] for j in range(n)] for i in range(m)]
Run Code Online (Sandbox Code Playgroud)

  • 由于“A”是一个数组,因此使用“A[i,j]”来索引元素会更清晰。 (2认同)

hpa*_*ulj 6

使用numpy数组,我们尝试避免迭代(列表理解).有时需要它,但在这种情况下它不是:

In [403]: A=np.arange(16).reshape(4,4)    
In [404]: A1=A.astype(np.float64)    # better syntax for converting to float

In [405]: A1
Out[405]: 
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.]])
Run Code Online (Sandbox Code Playgroud)

一个布尔数组,显示测试为True/False的位置:

In [406]: A1<5 
Out[406]: 
array([[ True,  True,  True,  True],
       [ True, False, False, False],
       [False, False, False, False],
       [False, False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

我们可以使用这样的掩码进行索引:

In [407]: A1[A1<5]=5

In [408]: A1
Out[408]: 
array([[  5.,   5.,   5.,   5.],
       [  5.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.]])
Run Code Online (Sandbox Code Playgroud)

np.where(和np.nonzero)返回条件为True的索引; where有一个像三元运算符一样运行的版本(在每个元素上):

In [410]: np.where(A<5,5,A)
Out[410]: 
array([[ 5,  5,  5,  5],
       [ 5,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
Run Code Online (Sandbox Code Playgroud)

我们还clip可以np.maximum:

In [411]: np.maximum(A,5)
Out[411]: 
array([[ 5,  5,  5,  5],
       [ 5,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [417]: A.clip(5,None)
Out[417]: 
array([[ 5,  5,  5,  5],
       [ 5,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
Run Code Online (Sandbox Code Playgroud)