Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将二维NumPy数组的对应值映射到一维数组_Python_Algorithm_Numpy_Optimization - Fatal编程技术网

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
中的元素顺序相同。