以有效的方式查找数组的元素

时间:2018-12-22 22:12:44

标签: python python-3.x numpy tuples

所以我有一个如下的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

据我所知,有可能使用结构化数组。但是,还有另一种方法吗?

3 个答案:

答案 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