所以我有一个如下的numpy数组(b):
[[1, 2, 20.1, 20.0],
[1, 4, 22.1, 21.0],
[1, 9, 25.1, 20.0],
[1, 12, 27.1, 22.0]]
基本上,前两个数字(1,2)(1,4)(1,9)(1,12)表示x和y。 另外两个(20.1,20.00)代表另外两个数量。
我想通过以下方式访问数组:
b[1,2,0] = 20.1
b[1,2,1] = 20.0
b[1,4,0] = 22.1
b[1,4,1] = 21.0
据我所知,有可能使用结构化数组。但是,还有另一种方法吗?
答案 0 :(得分:1)
您想要将数组(使用下标样式的索引)转换为字典(使用三元组样式的索引):
a = {}
for i in range(len(b)):
a[b[i][0], b[i][1], 0] = b[i][2]
a[b[i][0], b[i][1], 1] = b[i][3]
您想要的字典将位于a
编辑:我假设b[1, 2, 1]
应该是20.0
而不是20.9
答案 1 :(得分:0)
通过条件索引使用numpy.where
的其他选项。
只需定义一个直接访问数组的方法即可:
import numpy as np
b = np.array([[1, 2, 20.1, 20.0],
[1, 4, 22.1, 21.0],
[1, 9, 25.1, 20.0],
[1, 12, 27.1, 22.0]])
def pick_up(h, k, i=0):
return b[np.where( (b[:,0] == h) & (b[:,1] == k) )][0,i+2]
pick_up(1, 9, 0) #=> 25.1
pick_up(1, 12, 1) #=> 22.0
答案 2 :(得分:0)
设置
a = np.array([[ 1. , 2. , 20.1, 20. ],
[ 1. , 4. , 22.1, 21. ],
[ 1. , 9. , 25.1, 20. ],
[ 1. , 12. , 27.1, 22. ]])
这是一个相当标准的numpy操作。如果您的输入数组很大,建议您查看scipy
稀疏矩阵,但是对于您的用例,使用数组完全可以。通常的想法是创建一个形状为(maxx, maxy, 2)
的数组,并使用numpy赋值来填充:
s = a[:, :2].astype(int)
x, y = s.T
m, n = s.max(0) + 1
z = np.zeros((m, n, 2))
z[x, y] = a[:, 2:]
现在,只需按所需方式访问z
:
>>> z[1, 2, 0]
20.1