gpt4 book ai didi

python - 从 dict 创建 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:44 25 4
gpt4 key购买 nike

假设我有一个字典,将其命名为coeffs:

coeffs = {'X1': 0.1, 'X2':0.2, 'X3':0.4, ..., 'Xn':0.09}

如何将值转换为 1 x n ndarray

进入 n x m ndarray

最佳答案

下面是一个使用 coeffs 填充数组的示例,其中值索引来自字典键:

In [591]: coeffs = {'X1': 0.1, 'X2':0.2, 'X3':0.4, 'X4':0.09}
In [592]: alist = [[int(k[1:]),v] for k,v in coeffs.items()]
In [593]: alist
Out[593]: [[4, 0.09], [3, 0.4], [1, 0.1], [2, 0.2]]

这里我去掉了首字符并将其余字符转换为整数。您可以自己进行转换。

现在只需初始化一个空数组,然后填充值:

In [594]: X = np.zeros((5,))
In [595]: for k,v in alist: X[k] = v
In [596]: X
Out[596]: array([ 0. , 0.1 , 0.2 , 0.4 , 0.09])

显然我可以使用 X = np.zeros((1,5))。除非有为每个字典项目选择 n 的基础,否则 (n,m) 数组没有意义。


开玩笑,这是从字典创建数组的另一种方法——将键和值放入结构化数组的字段中:

In [613]: X = np.zeros(len(coeffs),dtype=[('keys','S3'),('values',float)])
In [614]: X
Out[614]:
array([(b'', 0.0), (b'', 0.0), (b'', 0.0), (b'', 0.0)],
dtype=[('keys', 'S3'), ('values', '<f8')])
In [615]: for i,(k,v) in enumerate(coeffs.items()):
X[i]=(k,v)
.....:
In [616]: X
Out[616]:
array([(b'X4', 0.09), (b'X3', 0.4), (b'X1', 0.1), (b'X2', 0.2)],
dtype=[('keys', 'S3'), ('values', '<f8')])
In [617]: X['keys']
Out[617]:
array([b'X4', b'X3', b'X1', b'X2'],
dtype='|S3')
In [618]: X['values']
Out[618]: array([ 0.09, 0.4 , 0.1 , 0.2 ])

scipy sparse 模块有一个稀疏矩阵格式,将其值存储在字典中,实际上它是字典的一个子类。此字典中的键是 (i,j) 元组,即非零元素的索引。 Sparse 具有将此类矩阵快速转换为其他计算更友好的稀疏格式和常规密集数组的工具。

我在其他 SO 问题中了解到,构建此类矩阵的快速方法是使用常规字典 update 方法从另一个字典复制值。

受到此问题的 @user's 二维版本的启发,下面介绍了如何创建这种稀疏矩阵。

@user's 示例 coeffs 开始:

In [24]: coeffs
Out[24]:
{'Y8': 22,
'Y2': 16,
'Y6': 20,
'X5': 20,
'Y9': 23,
'X2': 17,
...
'Y1': 15,
'X4': 19}

定义一个小函数,将键的 X3 样式转换为 (0,3) 样式:

In [25]: def decodekey(akey):
pt1,pt2 = akey[0],akey[1:]
i = {'X':0, 'Y':1}[pt1]
j = int(pt2)
return i,j
....:

将其与字典推导一起应用于 coeffs(或在早期 Python 版本中使用常规循环):

In [26]: coeffs1 = {decodekey(k):v for k,v in coeffs.items()}
In [27]: coeffs1
Out[27]:
{(1, 2): 16,
(0, 1): 16,
(0, 0): 15,
(1, 4): 18,
(1, 5): 19,
...
(0, 8): 23,
(0, 2): 17}

导入sparse并定义一个空的dok矩阵:

In [28]: from scipy import sparse
In [29]: M=sparse.dok_matrix((2,10),dtype=int)
In [30]: M.A
Out[30]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

coeffs1 字典值填充它:

In [31]: M.update(coeffs1)
In [33]: M.A # convert to dense array
Out[33]:
array([[15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
[14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])

实际上,我不需要使用sparsecoeffs1 转换为数组。 (i,j)元组可以直接索引数组,A[(i,j)]A[i,j].

In [34]: A=np.zeros((2,10),int)
In [35]: for k,v in coeffs1.items():
....: A[k] = v
....:
In [36]: A
Out[36]:
array([[15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
[14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])

关于python - 从 dict 创建 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33657684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com