numpy 如何从循环中提取最小数以及最小值是什么

jmo0nnb3  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(164)

我试图找出每个i的k的最小值以及k最小时m的相应值

import numpy as np
    
R0=np.arange(1, 2, 0.9)
m=[3, 7.01559, 50, 13.3237, 16.4706]

for i in R0:
    for j in m:
        k=i/j
        print('%.5f' % k)
    print("The minimum number for R0 =",i,"is" "and is minimum at m=")
    print('\n')

我希望我的输出为我提供:

0.33333
0.14254
0.02000
0.07505
0.06071

R0=1时的最小值为0.02000,并且在m=50时最小

0.63333
0.27083
0.03800
0.14260
0.11536

R0 =1.9时的最小波数为0.03800,m=50时最小
有人能帮我一下吗?

ohfgkhjo

ohfgkhjo1#

不要使用循环,使用麻木广播:

out = (R0[:,None]/m).min(0)

输出:array([0.33333333, 0.14253969, 0.02 , 0.07505423, 0.06071424])
中间体:

(R0[:,None]/m)

array([[0.33333333, 0.14253969, 0.02      , 0.07505423, 0.06071424],
       [0.63333333, 0.2708254 , 0.038     , 0.14260303, 0.11535706]])
mwg9r5ms

mwg9r5ms2#

溶液1:幼稚

您可以修改现有代码以跟踪每次迭代的最小值:

R0=np.arange(1, 2, 0.9)
m = [3, 7.01559, 50, 13.3237, 16.4706]

# initialize minimum r0 at infinity to ensure it will be set to the value of an element from R0
min_r0 = np.inf

# initialize min_m to an arbitrary value
min_m = 0

for i in R0:
    for j in m:
        k=i/j
        if k < min_r0:
            min_r0 = k
            min_m = j
        print('%.5f' % k)
    print("The minimum number for R0 =", i, "is %.5f" % min_r0, "and is minimum at m =", min_m)
    print() # print a blank line
    min_r0 = np.inf

溶液2:使用numpy数组操作

这个代码段执行数学运算的效率更高,而且可读性更好:

R0=np.arange(1, 2, 0.9)
m = [3, 7.01559, 50, 13.3237, 16.4706]

for rval in R0:
    rval_over_m = np.divide(rval, m)    # element-wise division
    min_rval_over_m_idx = np.argmin(rval_over_m)
    min_rval_over_m = rval_over_m[min_rval_over_m_idx]
    m_at_min = m[min_rval_over_m_idx]
    print('\n'.join([f'{num:.5f}' for num in rval_over_m]))
    print(f"The minimum number for R0={rval:.5g} is {min_rval_over_m:.5f}"
          f" and is minimum at m={m_at_min}\n")

溶液3:纯麻木

按照@mozway提供的使用numpy broadcasting的技巧,下面的代码片段在进入打印循环之前,使用矢量化操作来划分数组并提取最小值:

R0=np.arange(1, 2, 0.9)
m = [3, 7.01559, 50, 13.3237, 16.4706]

# get the index of the minimum value of R0[i] / m for i in range(len(R0))
rvals_over_m = R0[:, np.newaxis] / m
min_rvals_over_m_idx = np.argmin(rvals_over_m, axis=1)

# print the results
for i in range(len(R0)):
    rval_over_m = rvals_over_m[i]
    min_rval_over_m_idx = min_rvals_over_m_idx[i]
    min_rval_over_m = rval_over_m[min_rval_over_m_idx]
    m_at_min = m[min_rval_over_m_idx]
    print('\n'.join([f'{num:.5f}' for num in rval_over_m]))
    print(f"The minimum number for R0={R0[i]:.5g} is {min_rval_over_m:.5f}"
          f" and is minimum at m={m_at_min}\n")

输出:

0.33333
0.14254
0.02000
0.07505
0.06071
The minimum number for R0=1 is 0.02000 and is minimum at m=50

0.63333
0.27083
0.03800
0.14260
0.11536
The minimum number for R0=1.9 is 0.03800 and is minimum at m=50

相关问题