【问题标题】:Python NumPy array of objects where each object is a different size NumPy arrayPython NumPy 对象数组,其中每个对象都是不同大小的 NumPy 数组
【发布时间】:2021-04-28 04:58:05
【问题描述】:

我想创建一个 numpy 对象数组,其中对象是其他 numpy 数组具有不同或精确的尺寸。目的是在处理嵌套数组可能具有不同大小的数组时进行高级索引。

如果所有嵌套数组的维度不同,则一切正常:

a = np.array([np.array([0, 1], dtype=int), np.array([0, 1, 2], dtype=int)], dtype=object)
print(a[0].dtype, a[1].dtype)

在这种情况下,所有嵌套数组的 dtype 都等于 'int64'。

但是当嵌套数组具有相同的维度时,嵌套数组也成为对象数组:

a = np.array([np.array([0, 1, 2], dtype=int), np.array([3, 4, 5], dtype=int)], dtype=object)
print(a[0].dtype, a[1].dtype)

在这种情况下,所有嵌套数组的 dtype 都等于 'object'。

列表中的单个数组转换为对象数组的情况相同:

a = np.array([np.array([0, 1, 2], dtype=int)], dtype=object)
print(a[0].dtype)

问题是:创建对象数组的正确方法是什么,其中每个对象都是具有不同维度的 NumPy 数组以具有 dtype=int 的嵌套数组?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您的第一个混合子数组大小的案例:

    In [477]: a = np.array([np.array([0, 1], dtype=int), np.array([0, 1, 2], dtype=int)], dtype=
         ...: object)
         ...: 
    In [478]: a
    Out[478]: array([array([0, 1]), array([0, 1, 2])], dtype=object)
    

    在大小相同的情况下,numpy 可以生成最高维数组 - 2d:

    In [479]: a = np.array([np.array([0, 1], dtype=int), np.array([1, 2], dtype=int)], dtype=obj
         ...: ect)
         ...: 
    In [480]: a
    Out[480]: 
    array([[0, 1],
           [1, 2]], dtype=object)
    

    列表元素已经是数组这一事实并没有什么不同。

    创建和分配解决方案:

    In [481]: a = np.empty(2, object)
    In [482]: a
    Out[482]: array([None, None], dtype=object)
    In [483]: a[:]=[np.array([0, 1], dtype=int), np.array([1, 2], dtype=int)]
    In [484]: a
    Out[484]: array([array([0, 1]), array([1, 2])], dtype=object)
    

    您还可以添加一个额外的元素,例如。开头是 None,然后将其切掉。

    在任何情况下,诀窍都是避开np.array 对尽可能多维数组的偏好。

    【讨论】:

      【解决方案2】:

      老实说,在这种情况下,我认为您最好使用字典。字典查找数组的速度非常快,因为它们是一个哈希映射。

      import random
      
      import numpy as np
      
      my_sets = {}
      for i in range(0, 10):
          my_sets[i] = (np.random.random(random.randint(1, 10)))
      
      print(my_sets)
      

      该代码应该为您提供不同大小的 numpy 数组,但可以很容易地在字典中查找它们 - 至少我在工作中是这样做的

      【讨论】:

      • 这是一个有趣的解决方案,但我想使用 NumPy 的“高级索引”功能。
      【解决方案3】:
      import numpy as np
      a = np.array([np.array([0, 1, 2], dtype=int), np.array([3, 4], dtype=int)], dtype=object)
      print(a[0].dtype, a[1].dtype)
      

      【讨论】:

      • 如何在以下情况下使用这个技巧:a = np.array([np.random.randint(0,5,random.randint(1, 5)) for i in range(1 )], dtype = 对象)
      • 如何使用这个逻辑以动态方式创建数组?
      • 这与 OP 的第一个示例有何不同?
      猜你喜欢
      • 2022-01-26
      • 2011-09-02
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多