首页 > 解决方案 > 查找数组的每个元素与另一个数组的相对比例

问题描述

我有两个数组:A 和 B。

A = np.array([65, 20, 140, 15, 75, 15])
B = np.array([15, 45, 75, 106, 135, 165])

可以将 A 视为具有形状 (n,1) 的用户输入,其中 n 是任意正整数。B 可以被认为是具有形状 (m,1) 的固定规格,其中 m 是固定且已知的。

我试图获取数组 A 的每个元素相对于数组 B 的相对比例。结果将是一个形状为 (n, m) 的矩阵 M,如下所示:

M

array([[0.  , 0.33, 0.67, 0.  , 0.  , 0.  ],
       [0.83, 0.17, 0.  , 0.  , 0.  , 0.  ],
       [0.  , 0.  , 0.  , 0.  , 0.83, 0.17],
       [1.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
       [0.  , 0.  , 1.  , 0.  , 0.  , 0.  ],
       [0.67, 0.33, 0.  , 0.  , 0.  , 0.  ]])

在 M 的第一行中,第二个和第三个元素是 0.33 和 0.67,因为 65(A 的第一个元素)在 B 的 45 和 75(第二个和第三个)元素之间占 33%/ 67%。

M[0,1] = (75 - 65) / (75-45)
M[0,2] = 1 - M[0,1]

我一直在环顾四周,但似乎没有核心功能可以做到这一点。

非常感谢,

标签: python-3.xnumpy

解决方案


我相信这可以优化,但它似乎正在工作:

def f(ar: np.ndarray, br: np.ndarray):
    m = np.zeros((ar.shape[0], br.shape[0]))
    for ar_el, m_row in zip(ar, m):
        left = br[br <= ar_el]
        right = br[br >= ar_el]
        left_e = left[-1]
        right_e = right[0]
        if left_e == right_e:
            m_row[len(left) - 1] = 1
        elif left_e == br[-1]:
            m_row[-1] = 1
        elif right_e == br[0]:
            m_row[0] = 1
        else:
            m_row[len(left) - 1] = (right_e - ar_el) / (right_e - left_e)
            m_row[len(left)] = (ar_el - left_e) / (right_e - left_e)
    return m

以及您的数据的结果:

>>> np.around(f(a, b), decimals=2)
array([[0.  , 0.33, 0.67, 0.  , 0.  , 0.  ],
   [0.83, 0.17, 0.  , 0.  , 0.  , 0.  ],
   [0.  , 0.  , 0.  , 0.  , 0.83, 0.17],
   [1.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
   [0.  , 0.  , 1.  , 0.  , 0.  , 0.  ],
   [1.  , 0.  , 0.  , 0.  , 0.  , 0.  ]])

推荐阅读