python-3.x - 查找数组的每个元素与另一个数组的相对比例
问题描述
我有两个数组: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]
我一直在环顾四周,但似乎没有核心功能可以做到这一点。
非常感谢,
解决方案
我相信这可以优化,但它似乎正在工作:
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. ]])
推荐阅读
- xml - 从 xml 文件中提取值
- r - 分组 scale_fill_gradient/连续分组条形图
- html - 将样式更改为html表中的标题
- c# - 在 C# 中,调整数组大小(在这种情况下增加其大小)会使用默认值初始化新段——这可靠吗?
- visual-studio-code - 在 VSCode 中将多个搜索命中转换为多个光标
- javascript - Facebook javascript SDK 分享图片问题
- tcp - TCP 和 TLS 可以同时使用同一个端口号吗?
- ruby-on-rails - 在 express 应用程序中验证由 rails 生成的 CSRF 令牌
- python-3.x - 在python中将时间序列转换为日期时间格式
- vb.net - 单击 vb.net 中的单选按钮时更改按钮的背景颜色