python - python - 用 numpy.where 等 numpy 函数替换多个 if elif 语句和条件
问题描述
Radio_index、n_x 和 n_y 是整数,我写了一个可以运行的 if/elif 代码。目的是找到 radio_index 的 x,y 位置我能用 np.where 做吗
def radio_index2xy(radio_index,n_x,n_y):
con1 = radio_index <= n_x
con2 = (radio_index > n_x) & (radio_index <= n_x+n_y-1)
con3 = (radio_index > n_x+n_y-1) & (radio_index <= 2*n_x+n_y-2)
con4 = (radio_index > 2*n_x+n_y-2) & (radio_index <= 2*n_x+2*n_y-4)
condlist = [[con1],[con2],[con3],[con4]]
choicelist = [[x_pos = radio_index -1 ,y_pos = 0],\
[(x_pos = n_x -1),(y_pos = radio_index - n_x)],\
[(x_pos = (n_x-1)-(radio_index-n_x-n_y+1)),(y_pos = n_y -1)],\
[(x_pos = 0),(y_pos = 2*n_x+2*n_y-4-radio_index+1)]]
np.select(condlist,choicelist)
return x_pos,y_pos
if radio_index <= n_x:
x_pos = radio_index -1
y_pos = 0
elif radio_index > n_x and radio_index <= n_x+n_y-1:
x_pos = n_x -1
y_pos = radio_index - n_x
elif radio_index > n_x+n_y-1 and radio_index <= 2*n_x+n_y-2:
x_pos = (n_x-1)-(radio_index-n_x-n_y+1)
y_pos = n_y -1
elif radio_index > 2*n_x+n_y-2 and radio_index <= 2*n_x+2*n_y-4:
x_pos = 0
y_pos = 2*n_x+2*n_y-4-radio_index+1
解决方案
np.searchsorted
对于这种逻辑很有用:
def radio_index2xy_v(radio_index, n_x, n_y):
sgn = np.array([0, 1, 1, -1, -1, 0])
col = np.array([-1, 1, 0, 1, 0, -1])
coeffs = np.array([[-1, -1],
[0, -1],
[-n_x, n_x - 1],
[n_y - 1, 2*n_x + n_y - 2],
[2*n_x + 2*n_y - 3, 0],
[-1, -1]])
cusps = np.cumsum([0, n_x, n_y-1, n_x-1, n_y-2])
idx = cusps.searchsorted(radio_index)
out = coeffs[idx]
out[np.arange(idx.size), col[idx]] += sgn[idx] * radio_index
return out
演示:
>>> radio_index2xy_v(np.arange(20), 5, 4)
array([[-1, -1],
[ 0, 0],
[ 0, 1],
[ 0, 2],
[ 0, 3],
[ 0, 4],
[ 1, 4],
[ 2, 4],
[ 3, 4],
[ 3, 3],
[ 3, 2],
[ 3, 1],
[ 3, 0],
[ 2, 0],
[ 1, 0],
[-1, -1],
[-1, -1],
[-1, -1],
[-1, -1],
[-1, -1]])
推荐阅读
- c++ - 如何测量 C math.h 库函数的执行时间?
- firebase - 反应本机连接而不是总和
- ios - 当它从一个 collectionView 移动到另一个时,如何实现单元格动画?
- python - 熊猫数据框 set_index 不接受数组
- python - 如何知道在odoo中从哪个类调用另一个类的方法
- netsuite - 如何将多个销售订单合并为一张发票?
- kotlin - 为什么我的程序返回完全不同的值而不是数字?
- javascript - 如何使用 javascript 更改 HTML 表格单元格的背景颜色?
- swift - 将 PhotoCaptureDelegate.swift 中 photoOutput(didFinishProcessingPhoto) 中的图像传递给我的 ViewController
- java - 如何通过双击打开 kotlin 类文件?