需要编写某种分析仪来计算患者的生存率。简单来说,它的运行算法如下:
将医生计算出的某个值 VAL [ 1 ] 与二维数组中的值 [ 2 ] 进行比较。比较只应与第一列的数据进行比较。
VAL 的值可能与数组中的某个值完全匹配,也可能与数组中的任何值都不匹配,但非常接近其中一个;超出数组中的值的范围。
如果 VAL 值与数组中的某个值完全匹配,那么算法应该向医生打印第 [ 3 ] 行中的下一个值(例如如图所示,VAL = 11 ,算法将打印第 - 280 行中的下一个值)。
至此我已经写出了[ 2 ]阶段的简化模型。下面的代码:
import numpy as np
a = np.array([
[1, 244], [2, 211], [3, 466], [4, 698], [5, 899], [6, 109], [7, 129], [8, 140],
[9, 168], [10, 188], [11, 280], [12, 282], [13, 245], [14, 256], [15, 258],
[16, 305], [17, 352], [18, 345], [19, 365], [20, 348], [21, 440],[22, 424],
[23, 444], [24, 446], [25, 477], [26, 479], [27, 571], [28, 573], [29, 557],
[30, 577]
], int)
val = 11
if val in a:
print('СОВПАТЕНИЕ ЕСТЬ!')
idx = np.where(a == val)
row = idx[0][0]
print(f'Связанное значение: {a[row][1]}')
else:
print('СОВПАДЕНИЙ НЕТ!')
nearest_val = a.flat[np.abs(a - val).argmin()]
print(f'Ближайшее значение: {nearest_val}')
idx = np.where(a == nearest_val)
row = idx[0][0]
print(f'Связанное значение: {a[row][1]}')
该模型适用于两种情况:当 VAL 值与数组中的某个值完全匹配时,以及当没有精确的值,但有一个接近它的值时。第三个还没写。模型中使用的数组很小,只有 30 个值,而在成熟计算器中将使用的数组每列包含超过 5000 个值,并且在我看来,在这种情况下使用 Numpy 工具包是合乎逻辑的。
我想听听在这些问题上更有经验的同事的意见:
其逻辑实现得有多合理?从经验丰富的程序员的角度来看,是否存在更胜任的选择?
该算法一次搜索数组中的所有值,但如何将搜索限制在仅一列呢?
在模型中数组很小,但在计算器完整版本中将使用的数组每列包含超过 5000 个值。组织这种数组的最佳方法是什么?使其成为外部文件?或者将所有值移入代码本身?
我怎样才能以某种方式提取位于数组中的变量的索引值并将它们用作常规 int 值?在模型中我使用以下方法实现了这一点:
idx = np.where(a == val)
row = idx[0][0]
这是精确匹配。但我对这种方法的正确性表示严重怀疑。
补充:在研究strawdog 的评论 的过程中,我设法整理出了以下版本的算法:
import numpy as np
a = np.array([
[1, 244], [2, 211], [3, 466], [4, 698], [5, 899], [6, 109], [7, 129], [8, 140],
[9, 168], [10, 188], [11, 280], [12, 282], [13, 245], [14, 256], [15, 258],
[16, 305], [17, 352], [18, 345], [19, 365], [20, 348], [21, 440],[22, 424],
[23, 444], [24, 446], [25, 477], [26, 479], [27, 571], [28, 573], [29, 557],
[30, 577]
], int)
val = 2
row = a[np.abs(a[:,0] - val).argmin()]
if val in a[:,0]:
print(f'СОВПАТЕНИЕ ЕСТЬ!\n'
f'Связанное значение: {a[np.where(a == row)][1]}')
else:
print(f'СОВПАДЕНИЙ НЕТ!\n'
f'Ближайшее значение: {a[np.where(a == row)][0]}\n'
f'Связанное значение: {a[np.where(a == row)][1]}')
反过来,它与Serge3leo提出的选项非常相似。因此,我暂时就到此为止,稍后我将通过添加处理VAL值超出数组范围的情况的场景来补充答案。非常感谢strawdog和Serge3leo帮助我解决问题!
代码本身应该缩短一点:
这取决于更改的顺序。例如,如果这些是校准,那么在代码中肯定不值得,在文件中肯定更好,但如果这些是全局常量,那么在代码中是可能的。
在其他所有条件相同的情况下,归档是更好的选择,但这取决于复制程序/模块的预期过程。
附言
关于“文件/代码”问题的补充。严格来说,“代码”也分为两种:“代码”可以在自己的模块中,“代码”可以在单独的模块中并连接
import
。恕我直言,这个问题主要有两个方面:“如何分配?”以及“阵列如何变化?” (总会有错误修复和改进出现)。“如何分配?”:
pip/Hatch/Setuptools/PyInstaller/...
这并不是不便,但如果没有它们,就不那么方便了;“数组如何变化?”:
可能存在中间选择。
附言。
这个较大的值并不会导致严重的功耗或速度减慢,但请注意:
val in a[:,0]
平均会引发2500次以上的比较;np.where(a == row)
为2500..5000(取决于实现)。