我需要在NumPy数组中写入大量的数字对。由于很多这些对的第二个值为0,我想要制作类似于字典的东西。问题是我已经阅读了关于结构化数组的NumPy文档,看起来像页面上的那些字典只能使用字符串作为键。
除此之外,我需要插入和搜索以具有log(N)复杂性。我想使用常规的NumPy阵列作为存储来制作我自己的红黑树结构,但我相当确定这是一种更简单的方法。
语言是Python 2.7.12。
答案 0 :(得分:0)
所以你有一个(N,2)
数组,x[:,1]
中的很多值都是0。
insertion
你是什么意思?在数组中添加一个值以使其成为(N+1,2)
?或者只是将x[i,:]
更改为新内容?
搜索怎么样? numpy
数组非常适合查找第i个值x[i,:]
,但不适合查找与z
匹配的值。
python numpy filter two dimentional array by condition
scipy.sparse
实现了各种形式的稀疏矩阵,如果不到十分之一的可能值非零,则有用。一种格式是dok
,一种密钥字典。它实际上是一个dict
子类,键是2d索引元组(i,j)
。其他格式将它们的值存储为数组,例如。行,列和数据。
structured arrays
适用于具有适度数量的命名字段的情况,每个字段可以包含不同类型的数据。但我认为将(N,2)
数组转换为包含2个字段的(N,)
数组并不会有帮助。
=====
您的意见表明您不熟悉如何存储或访问numpy
数组。
数组由平面1d data buffer
(仅c
个字节数组)和shape
,strides
,itemsize
和{{}等属性组成。 {1}}。
我们说它是dtype
。
np.arange(100)
因此,如果我要求In [1324]: np.arange(100).__array_interface__
Out[1324]:
{'data': (163329128, False),
'descr': [('', '<i4')],
'shape': (100,),
'strides': (4,)
'typestr': '<i4',
'version': 3}
,它会计算步幅,4个bypes /元素,* 50个元素= 200个字节,并在x[50]
代码中询问{{1}处的4个字节它将它们作为整数(实际为c
类型的对象)返回。
对于结构化数组,每个元素的类型descr和bytes将更大,但访问将是相同的。对于二维数组,它将采用形状并将元组考虑在内以找到适当的索引。
(N,2)整数数组的步幅是(8,4)。因此,163329128+200
元素的访问权限为np.int32
。 x[10,1]
的访问权限为10*8 + 1*4 = 84
抵消。
但在所有情况下,它依赖于以矩形可预测模式排列的值。 x[:,1]
数据结构没什么特别之处。它们相对较快,因为许多操作都是用编译的代码编写的。
对数组进行排序,按值访问项目以及重新排列元素,但不是一个强点。这些操作通常会生成一个新数组,其值以某种新模式从旧模式复制到新模式。
只有少数内置i*8 for i in range...
数组子类,主要是numpy
和numpy
,并且它们不扩展访问方法。子类化并不像普通的Python类那么容易,因为它np.matrix
有很多自己编译的代码。子类必须使用np.masked_array
方法而不是常规numpy
。
有些Python模块可以维护排序列表,__new__
和__init__
。但我不明白他们将如何帮助你解决大量的内存问题。
答案 1 :(得分:0)
字典的最基本形式是称为HashMap
的结构。实现hashmap依赖于将密钥转换为可以快速查找的值。一个病态示例是使用int
作为键:键1
的值将放在array[1]
中,键2
的值将放入array[2]
,Hash函数只是身份函数。您可以使用numpy数组轻松实现它。
如果你想使用其他类型,只需编写一个好的哈希函数来将这些键转换为唯一索引到你的数组中。例如,如果您知道自己有(int, int)
元组,并且第一个值永远不会超过100,那么您可以执行100*key[1] + key[0]
。
哈希函数的实现将决定你的字典替换。