Numpy 数组条件并应用公式
Numpy array condition and apply a formula
我有一个默认的 numpy 数组(速度、压力或温度数据),如下所示:
a=[[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[30. 31. 32. 33. 34. 35. 36. 37. 38. 39.]
[40. 41. 42. 43. 44. 45. 46. 47. nan 49.]]
我需要申请以下条件,然后使用相应的公式
a<5 (a*5)+4
a>5 (a**2.)-2
我尝试使用:
a[a<5]=(a[a<5]*5.)+4.
但它不起作用,我也使用了创建布尔矩阵然后将它们乘以与条件对应的公式的方法,如下所示:
les=(a<5.).astype(float)
mayor=(a>5.).astype(float)
les=les*((a*5)+4)
mayor=mayor*((a**2.)-2)
b=les+mayor
这可行,但它使用了很多行代码,我认为这是不切实际的,我想知道是否有更简单的方法来做到这一点。
尝试使用嵌套列表理解
answer = [[(x*5)+4 if x<5 else (x**2.)-2 for x in row] for row in a]
这实际上将逐行使用您定义的条件为每一行创建一个新列表以转换每个元素
根据 hpaulj 在评论中的建议,您可以使用 np.where:
>>> np.where(a<5, (a*5)+4, (a**2)-2)
array([[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[898., 959., 1022., 1087., 1154., 1223., 1294., 1367., 1442., 1519.],
[1598., 1679., 1762., 1847., 1934., 2023., 2114., 2207., nan, 2399.]])
但是,根据您提供的条件:
a<5: (a*5)+4
a>5: (a**2.)-2
对于a = 5
,5的值应该保持不变。这是一种方法:
b = a.copy()
b[a<5] = a[a<5]*5 + 4
b[a>5] = a[a>5]**2 - 2
结果:
array([[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[898., 959., 1022., 1087., 1154., 1223., 1294., 1367., 1442., 1519.],
[1598., 1679., 1762., 1847., 1934., 2023., 2114., 2207., nan, 2399.]])
我有一个默认的 numpy 数组(速度、压力或温度数据),如下所示:
a=[[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[30. 31. 32. 33. 34. 35. 36. 37. 38. 39.]
[40. 41. 42. 43. 44. 45. 46. 47. nan 49.]]
我需要申请以下条件,然后使用相应的公式
a<5 (a*5)+4
a>5 (a**2.)-2
我尝试使用:
a[a<5]=(a[a<5]*5.)+4.
但它不起作用,我也使用了创建布尔矩阵然后将它们乘以与条件对应的公式的方法,如下所示:
les=(a<5.).astype(float)
mayor=(a>5.).astype(float)
les=les*((a*5)+4)
mayor=mayor*((a**2.)-2)
b=les+mayor
这可行,但它使用了很多行代码,我认为这是不切实际的,我想知道是否有更简单的方法来做到这一点。
尝试使用嵌套列表理解
answer = [[(x*5)+4 if x<5 else (x**2.)-2 for x in row] for row in a]
这实际上将逐行使用您定义的条件为每一行创建一个新列表以转换每个元素
根据 hpaulj 在评论中的建议,您可以使用 np.where:
>>> np.where(a<5, (a*5)+4, (a**2)-2)
array([[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 23., 34., 47., 62., 79.],
[898., 959., 1022., 1087., 1154., 1223., 1294., 1367., 1442., 1519.],
[1598., 1679., 1762., 1847., 1934., 2023., 2114., 2207., nan, 2399.]])
但是,根据您提供的条件:
a<5: (a*5)+4
a>5: (a**2.)-2
对于a = 5
,5的值应该保持不变。这是一种方法:
b = a.copy()
b[a<5] = a[a<5]*5 + 4
b[a>5] = a[a>5]**2 - 2
结果:
array([[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[4., 9., 14., 19., 24., 5., 34., 47., 62., 79.],
[898., 959., 1022., 1087., 1154., 1223., 1294., 1367., 1442., 1519.],
[1598., 1679., 1762., 1847., 1934., 2023., 2114., 2207., nan, 2399.]])