numpy 有没有一种快速的方法来获得一个基于研究标准的数组的子部分?

snz8szmq  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(157)

我已经得到了下面两个numpy数组。第一个是一列,其中包含数千万个点的ID。第二个表示点及其坐标x,y。它有3列:id,x,y。它还包含数千万个点。

import numpy as np

points = np.array([[id], [id], ..., [id]])  # array of points
coordinates = np.array([[id, x, y], ..., [id, x, y]]) # array of points and their coordinates

我想得到数组 coordinates 的所有行,其中ID在数组 points 中的数字。在SQL中,它将被写入SELECT * FROM coordinates WHERE id IN points(并保持结果以与数组中相同的方式排序)
我有以下限制:

  • ID的排序方式不同
  • 我正在寻找一个没有任何循环索引的解决方案(以获得更快的算法)

我尝试了以下方法:

indexes = []
for i in range(len(points)):
    indexes.append(np.where(coordinates[:,0] == points[i])[0][0]
result = coordinates[indexes, :]

这是一个循环的解决方案,这就是我想要避免的。

dldeef67

dldeef671#

你能提供一些关于如何在Python中加载所有这些数据的背景吗?我相信如果你从一开始就以更好的格式存储数据,你可以让这样的查询更快。
例如,可以将坐标存储在pandas.Series对象中,其中coordinates中的id可以设置为相应[x,y]值的索引列:

import pandas as pd
points = # You can load these as you already have
ids_xy = # Load ids for the coordinates separately
coordinates_xy = # Load the x, y coordinates separately
coordinates = pd.Series(coordinates_xy, index=ids_xy)

对于从当前格式到此格式的一次性转换(如果您正在运行某种ipynb并且已经加载了数据,则适用),您可以执行以下操作:

coordinate_series = pd.Series([(x, y) for _, x, y in coordinates], index=coordinates[:, 0])

这样,您就可以按coordinates.loc[points]索引所有要查询的坐标

相关问题