【问题标题】:Finding tuple inside an array and get its index and value在数组中查找元组并获取其索引和值
【发布时间】:2020-12-27 07:38:59
【问题描述】:

我有一个这样的数组

np.array([[(115, 1), 47],
       [(115, 2), 1],
       [(115, 3), 3],
       [(2147482888, 5), 26],
       [(275030867, 5), 3]], dtype=object)

我如何获得所需的元组 say (115, 1) 并获得其对应的 值 47 并根据某些加法或减法更新它 条件。

如果数组包含 (115, 1),假设我想获取 (115, 1) 并在其值 47 + 2 上加 2

如果数组不包含 (10009, 10) 则将其添加到数组中,默认值为 10

谢谢

【问题讨论】:

  • 这是错误的数据结构。你可能想要一个字典,而不是一个数组

标签: numpy tuples numpy-ndarray


【解决方案1】:

数组最适合用于连续的同质数据块(例如 n 数组浮点数)。听起来你想要一个键值对的字典。在这种情况下,您可以执行以下操作:

# original data
x = np.array([[(115, 1), 47],
       [(115, 2), 1],
       [(115, 3), 3],
       [(2147482888, 5), 26],
       [(275030867, 5), 3],
       [0, 0]], dtype=object)

d = dict(x)
d[(115,1)] += 2

输出:

{(115, 1): 49,
 (115, 2): 1,
 (115, 3): 3,
 (2147482888, 5): 26,
 (275030867, 5): 3,
 0: 0}

【讨论】:

  • 我目前正在使用默认字典,但它太消耗内存来搜索和更新它。我认为使用 numpy 数组会减少内存
  • 字典有多大?它将如何使用?如果内存不足,可以考虑使用数据库(postgres)。
  • 8000 万个键和值
  • 啊。使用 defaultdict 时内存不足?
  • 所以只使用 dict 而不是 defaultdict ?有没有办法通过 numpy 解决?我也可以更改我的数组结构,而不是让元组数组也可以得到 [[115,1,47]]
【解决方案2】:

快速和紧凑仅适用于数字 numpy 数组。使用 object dtype,速度和存储类似于列表(甚至可能更慢)。

In [39]: arr =np.array([[(115, 1), 47],
    ...:        [(115, 2), 1],
    ...:        [(115, 3), 3],
    ...:        [(2147482888, 5), 26],
    ...:        [(275030867, 5), 3]], dtype=object)
In [40]: arr.shape
Out[40]: (5, 2)

这样一个数组的一个优点是它很容易访问“列”:

In [41]: arr[:,0]
Out[41]: 
array([(115, 1), (115, 2), (115, 3), (2147482888, 5), (275030867, 5)],
      dtype=object)
In [42]: arr[:,1]
Out[42]: array([47, 1, 3, 26, 3], dtype=object)

整个数组作为列表的列表:

In [43]: alist = arr.tolist()
In [44]: alist
Out[44]: 
[[(115, 1), 47],
 [(115, 2), 1],
 [(115, 3), 3],
 [(2147482888, 5), 26],
 [(275030867, 5), 3]]

但是对于查找元组,使用元组列表更容易:

In [47]: alist = arr[:,0].tolist()
In [48]: alist
Out[48]: [(115, 1), (115, 2), (115, 3), (2147482888, 5), (275030867, 5)]
In [49]: alist.index((115,1))
Out[49]: 0
In [50]: alist.index((115,3))
Out[50]: 2
In [51]: arr[2,:]
Out[51]: array([(115, 3), 3], dtype=object)

也就是说,您的结构和所需的操作确实更像字典操作。 numpy 不适合查找“密钥”并添加它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2016-06-09
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多