问题是:给定一个(大的)列表列表,或者半等价的NumPy数组,以类似于SQL的方式从数组中提取信息,也就是说,就像数组是一个数据库一样。
例如:给定一个4列乘(大)N行数组,提取第一列等于X的行。在SQL中,这将是:SELECT * FROM array WHERE col_1_id = X
然而,在Python语言中..._(ツ)_/
试图让这个问题变得更加清晰:
所讨论的数组保存在每个子列表/行[M, a^2, b^2, c^2
]中,其中M
是平方的和。该列表包含数百万个条目,M的范围从~100到~10^6。
我们希望从该数据中只提取至少8个不同行的总和相同的行。简单地说,我们可以使用一个循环来完成此操作:
Output = []
for i in [0..10^6]:
newarray = []
for row in array:
if row[0] == i:
newarray.append(row)
if len(newarray) >= 8:
Output.extend(newarray)
save(Output, 'outputfilename')
此输出是一个更短且更可行的数组。但我的理解是,这是非常低效的(我们循环遍历一百万个行数组一百万次,这是一万亿次调用,这似乎是有问题的)。
如果这些数据在数据库中,我可以使用以下命令获取它:SELECT * FROM array WHERE col_1 = i AND COUNT(i) >= 8
(根据不同的SQL,这可能会采取不同的形式)。
据我所知,无论是Python还是NumPy都没有这样的内置函数。我不希望该语言解析SQL查询,但该语言中必须有某种工具来近似此函数。
Numpy有一个select
方法,它实际上不以这种方式选择行,而其他一些方法听起来可能会使这些操作成为可能,但似乎没有做任何类似的事情。如下文所述,文档中的示例非常少。
我见过使用collections.Counter()
完成类似的事情,但我不确定这个特定的愿望是否可以用它来实现,也不确定如何实现。文件是..。仅举一些例子。
我意识到这可能是一个XY问题,因此试图省略X,除非作为我尝试过的例子。然而,我需要使用Python的工具(通过SageMath/jupyter)。如果有一种方法可以以类似数据库的格式直接存储NumPy/Python数据,并使用类似SQL的查询来访问它,那就太好了。
1条答案
按热度按时间xuo3flqw1#
这可能不是您正在寻找的东西,但我希望它能对您有所帮助。:)我编写了一个循环实现,它应该比您提供的实现更高效,因为我们只对列进行了两次循环。我们使用字典来记录第一列中特定值出现的次数。