首页 > 解决方案 > 使用来自 linspace 的坐标获取矩阵中的索引

问题描述

我有一个由两个 linspaces xy定义的矩阵m

x = np.linspace(-1, 1, 100).reshape(1, 100)
y = np.linspace(-1, 1, 100).reshape(100, 1)

m = x + 1j * y

# > m.shape
# (100, 100)

如果我想将一个值设置为给定 linspace 中定义的坐标点,而不是数组索引,该怎么办?

例如,我想写这样的东西:

m[-0.5, 0.123] = val

numpy 中是否有一种优雅的方法可以将坐标系转换为数组中最近的索引?

标签: numpy

解决方案


这里有两种可能的方式。您可以使用np.searchsorted根据提供的值查找索引x并且y正在增加。如果xy是均匀分布的(如您的示例),那么您可以在 O(1) 时间内linspace近似值的索引val(val - (-1) / (1 - (-1)) * 100

import numpy as np

z = np.linspace(-1, 1, 100)
m = z[None,:] + 1j * z[:,None]
# using searchsorted
f = lambda v: np.searchsorted(z, v)
# approximate the index using the fact that numbers in z are evenly spaced
g = lambda v: int((v - z[0]) / (z[-1] - z[0]) * z.shape[0])

print(m[f(0.5), f(0.123)])
# (0.1313131313131315+0.5151515151515154j)
print(m[g(0.5), g(0.123)])
# (0.1313131313131315+0.5151515151515154j)

推荐阅读