Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Numpy_Dictionary_Red Black Tree - Fatal编程技术网

Python 如何使用NumPy数组实现字典?

Python 如何使用NumPy数组实现字典?,python,arrays,numpy,dictionary,red-black-tree,Python,Arrays,Numpy,Dictionary,Red Black Tree,我需要将大量的数字对写入一个NumPy数组。因为这些对中有很多的第二个值是0,所以我想做一些类似于字典的东西。问题是我已经通读了关于结构化数组的NumPy文档,看起来像页面上那样构建的字典只能使用字符串作为键 除此之外,我需要插入和搜索,以具有日志(N)复杂性。我曾想过使用一个常规的NumPy数组作为存储来创建自己的红黑树结构,但我相当确定有一种更简单的方法来实现这一点 语言是Python2.7.12。因此您有一个(N,2)数组,x[:,1]中的许多值都是0 你所说的插入是什么意思?向数组添加值

我需要将大量的数字对写入一个NumPy数组。因为这些对中有很多的第二个值是0,所以我想做一些类似于字典的东西。问题是我已经通读了关于结构化数组的NumPy文档,看起来像页面上那样构建的字典只能使用字符串作为键

除此之外,我需要插入和搜索,以具有日志(N)复杂性。我曾想过使用一个常规的NumPy数组作为存储来创建自己的红黑树结构,但我相当确定有一种更简单的方法来实现这一点

语言是Python2.7.12。

因此您有一个
(N,2)
数组,
x[:,1]
中的许多值都是0

你所说的插入是什么意思?向数组添加值以使其
(N+1,2)
?或者只是把
x[i,:]
换成新的东西

那搜索呢
numpy
数组非常适合查找第i个值,
x[i,:]
,但不适合查找与
z
匹配的值。

scipy.sparse
实现了各种形式的稀疏矩阵,如果不到十分之一的可能值为非零,则该矩阵非常有用。一种格式是
dok
,一种键字典。它实际上是一个
dict
子类,键是一个二维索引元组
(i,j)
。其他格式将其值存储为数组,例如行、列和数据

结构化数组
适用于具有少量命名字段的情况,每个字段可以保存不同类型的数据。但我认为将
(N,2)
数组转换为包含两个字段的
(N,)
数组没有任何帮助

================

您的评论表明您不熟悉
numpy
数组的存储或访问方式

数组由一个扁平的1d
数据缓冲区
(只是一个
c
字节数组)和
形状
步幅
项目大小
数据类型
等属性组成

假设它是np.arange(100)

[1324]中的
:np.arange(100)。\uuuu数组\u接口__
Out[1324]:
{'data':(163329128,假),

'descr':[('',字典最基本的形式是一种称为
HashMap
的结构。实现HashMap依赖于将键转换为可以快速查找的值。病理学示例是使用
int
s作为键:键
1
的值将进入
数组[1]
,键
2
的值将进入
数组[2]
,哈希函数只是标识函数。您可以使用numpy数组轻松实现它

如果您想使用其他类型,只需编写一个好的哈希函数,将这些键转换为数组中的唯一索引。例如,如果您知道有一个
(int,int)
元组,并且第一个值永远不会超过100,则可以执行
100*key[1]+key[0]


哈希函数的实现将决定字典替换的成败。

为什么需要专门使用NumPy数组?@David Z,因为我使用的数据量太大,无法存储在RAM上。这就是为什么我需要将它提供给另一个数据类型(此数据类型)它支持直接写入硬盘的数据库。实际上,它有一个NumPy阵列,可以在需要时写入硬盘…啊,这是有用的信息(并包括在问题中)。它还提供了使用不同大容量存储库的选项,如果有一个库可以简化此任务的话。@DavidZ好吧,使用另一个库并不是一个真正的选项,因为我必须在新系统上重做所有事情,这可能比编写自己的包装器更困难。无论如何,我将把它留到下个星期k思考。希望有人有想法……是的,我明白了,我可以轻松地构建数组,以便快速找到值的位置,但插入是个问题。如果我想保持数组排序,在插入后,我需要将每个大于插入的元素向右移动,有效地使插入的复杂性为O(n).我需要达到O(logN)的复杂度,就像使用红黑树可以做到的那样(最好不需要自己编写它…你可以说我想要一个(N,2)数组,它按其第一个元素排序,这样它的插入和搜索复杂度为O(logN)。通过插入,我的意思是向数组中添加一个新元素,使其保持排序状态。通过搜索,我的意思是查找索引,从而查找元素的第二个值,给定它的第一个值。我知道这是可能的,因为这是Python字典的工作方式。我问是否有一个内置子类型numpy.array,其中包含ese属性,因为它有索引…通过上所述的元素(指定名称而不是索引部分)。此外,我严格限于NumPy数组,因此没有scipy或其他库…我已详细介绍了NumPy数组的存储和访问方式。
In [1324]: np.arange(100).__array_interface__
Out[1324]: 
{'data': (163329128, False),
 'descr': [('', '<i4')],
 'shape': (100,),
 'strides': (4,)
 'typestr': '<i4',
 'version': 3}