Python 如何将二维NumPy数组的对应值映射到一维数组
我已经编写了这段代码:Python 如何将二维NumPy数组的对应值映射到一维数组,python,algorithm,numpy,optimization,Python,Algorithm,Numpy,Optimization,我已经编写了这段代码: data=np.array([[3,6],[5,9],[4,8]) 原点x,原点y=np.split(数据,2,轴=1) x=np.array([3,4]) y=np.零((len(x))) 对于范围内的i(len(x)): y[i]=orig_y[np.其中(orig_x==x[i])[0]] 基本上,我有一个2D NumPy数组。我把它分成两个一维数组orig_x和orig_y,一个存储x轴的值,另一个存储y轴的值 我还有另一个1D NumPy数组,它包含orig_
data=np.array([[3,6],[5,9],[4,8])
原点x,原点y=np.split(数据,2,轴=1)
x=np.array([3,4])
y=np.零((len(x)))
对于范围内的i(len(x)):
y[i]=orig_y[np.其中(orig_x==x[i])[0]]
基本上,我有一个2D NumPy数组。我把它分成两个一维数组orig_x和orig_y,一个存储x轴的值,另一个存储y轴的值
我还有另一个1D NumPy数组,它包含orig_x数组中存在的一些值。我想找到x数组中每个值的y轴值。我创建了这个方法,使用了一个简单的循环,但是速度非常慢,因为我使用了数千个值
你有更好的主意吗?也许通过使用NumPy函数
注意:也可以为这个问题设置一个更好的标题。抱歉:(我不能100%确定我是否正确理解了这个问题,但我认为以下方法应该有效:
>>行,列=np.where(orig_x==x)
>>>y=orig_y[行[np.argsort(cols)]].ravel()
>>>y
数组([6,8])
它假定
orig_x
中的所有值都是唯一的,但由于您的代码示例具有相同的限制,我认为它是给定的。查找表如何
import numpy as np
data = np.array([[3,6], [5,9], [4, 8]])
orig_x, orig_y = np.split(data, 2, axis=1)
x = np.array([3, 4])
y = np.zeros((len(x)))
您可以打包dict进行查找:
lookup = {i: j for i, j in zip(orig_x.ravel(), orig_y.ravel())}
只需将其映射到一个新数组:
np.fromiter(map(lambda i: lookup.get(i, np.nan), x), dtype=int, count=len(x))
array([6, 8])
如果orig_x
和orig_y
是较小的数据结构,这可能是最有效的
编辑-我突然想到,如果您的值是整数,那么默认的
np.nan
将不起作用,如果您试图找到一个不在orig_x
数组中的值,您应该找出哪个值对您的应用程序有意义。您可以创建一个掩码,在该掩码上输入x列中的值,然后使用这个m要求从y列中选择值
data = np.array([[3,6], [5,9], [4, 8]])
# the values you want to lookup on the x-axis
x = np.array([3, 4])
mask = np.isin(data[:,0], x)
data[mask,1]
输出:
array([6, 8])
array([6, 8])
这里的关键功能是使用np.isin
。其基本功能是将x
或数据
广播到适当的形状,并进行元素比较:
mask = data[:,0,None] == x
y_mask = np.logical_or.reduce(mask, axis=1)
data[y_mask, 1]
输出:
array([6, 8])
array([6, 8])
是的,我确实想要这样的东西,orig_x中的值是唯一的,但它似乎没有使它更快。也许没有优化它的解决方案。我想做一些计时测试。你的
数据和x
数组有多长?我现在测试的数据大约有500K值,而x数组大约有10K。Howev呃,数据可能从100K到10M不等。另外,我有两个X数组。每个数据数组都有X1和X2,所以这也会使它变慢。这是一个非常快速的解决方案,但我认为它返回的值顺序不正确(不遵循X
元素的顺序)。从OP中不清楚顺序是否重要。@Seb掩码是在x
的元素上排序的,这与y
中的元素顺序相同。