【问题标题】:Find an element of the array in an efficient way以有效的方式查找数组的元素
【发布时间】:2018-12-22 22:12:43
【问题描述】:

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

据我所知,可以使用结构化数组。但是,还有其他方法可以做到这一点吗?

【问题讨论】:

  • 您到底想达到什么目的?第一个索引中的 1、2、0 是什么?
  • 例如,额外的两个数字是否分别与 x 和 y 相关联?

标签: python python-3.x numpy tuples


【解决方案1】:

您想将数组(使用下标样式索引)转换为字典(使用 3 元组样式索引):

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

【讨论】:

  • 这行得通。谢谢!唯一的办法是用字典吗?因为我需要对像 2000^3 这样的大尺寸数组进行操作。据我所知,循环字典不会像循环 numpy 数组那样快。
  • @FF10:使用数组的问题是你的数据是稀疏的。 data[1, 3, 0] 应该是什么? data[1, 5, 0] 怎么样?这些都不是由您的示例数据集定义的,但是一个数组通常需要在其所有位置都有一些东西(当然它是为了高效的数学运算)。
  • @Blckknght 好的,我明白了这个问题。但是对于字典,我不需要执行循环来查找位置 x=1 和 x=2 在数组 b 中的位置。我想这会为我节省很多时间。
【解决方案2】:

通过条件索引使用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

【讨论】:

    【解决方案3】:

    设置

    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 稀疏矩阵,但对于您的用例,使用数组是完全可以的。大致思路是创建一个shape为(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
    

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2021-12-02
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多