我想知道是否有一种很好的方法可以在 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)]
有什么好的方法吗?或者,如果 numpy 有更快的计算方法,那即使不是更好,也同样好。
做我想要实现的目标的较长方法是
for i in range(m):
for j in range(n):
if A[i][j] < val:
A[i][j] = val
所需的输出是将低于阈值的任何值设置为该阈值。我可以用一维数组做更简单的 if 语句,例如
myArray = [otherArray[i] for i in range(theRange) if otherArray[i]>=value and otherArray[i]<=anotherValue]
这个一维示例不是我想要的。这只是我正在寻找的编码 block 类型的一个示例。它似乎比传统的 if-else 语句处理得更快。
最佳答案
对于 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.]])
显示测试为真/假的 bool 数组:
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)
我们可以用这样的掩码进行索引:
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.]])
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]])
我们也可以用np.maximum
clip
:
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]])
关于python - 你可以在 Python 中的数组的大括号内使用 if-else 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059796/