【问题标题】:forcing a creation of 1d numpy array from a list/array of possibly iterable objects强制从可能可迭代对象的列表/数组中创建 1d numpy 数组
【发布时间】:2020-07-11 08:15:27
【问题描述】:

我正在尝试查看是否有更漂亮的方法可以从另一个对象列表/数组创建(即强制创建)一维 numpy 数组。然而,这些对象可能具有自身可迭代的条目(因此它们可以是列表、元组等,但也可以是更任意的对象)。

所以为了让事情变得非常简单,让我考虑以下场景:

a=[(1,2), (3,4), (3,5)]
b=np.array(a, dtype=object)
b.shape # gives (2,3), but I would like to have (3,1) or (3,)

我想知道是否有一个很好的 pythonic/numpy'ish 方法来强制 b 具有形状 (3,),并且 a 的元素的可迭代结构在 b 中被忽略。现在我这样做:

a=[(1,2), (3,4), (3,5)]
b=np.empty(len(a), dtype=object)
for i,x in enumerate(a):
    b[i]=x
b.shape # gives (3,) this is what i want. 

这可行,但有点难看。我找不到更好的方法来以更内置于 numpy 的方式执行此操作。有什么想法吗?

(更多上下文:我真正需要做的是以各种方式重新调整b 的尺寸,因此我不希望b 知道其元素的尺寸(如果它们是可迭代的)。 谢谢!

【问题讨论】:

  • numpy 有一个重塑,如果这就是你的要求
  • 谢谢,不,这不是我要问的。我只是说上下文的最后一部分,一旦我的数组b 以“正确”的形式出现,稍后重新调整它的形状(即使用np.reshape)。

标签: python arrays numpy loops shapes


【解决方案1】:
In [60]: b = np.empty(3, object)         

从列表分配时不需要迭代:

In [61]: b[:] = [(1,2),(3,4),(3,5)]                                                            
In [62]: b                                                                                     
Out[62]: array([(1, 2), (3, 4), (3, 5)], dtype=object)
In [63]: b.shape                                                                               
Out[63]: (3,)

对于数组它不起作用:

In [64]: b[:] = np.array([(1,2),(3,4),(3,5)])                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-3042dce1f885> in <module>
----> 1 b[:] = np.array([(1,2),(3,4),(3,5)])

ValueError: could not broadcast input array from shape (3,2) into shape (3)

你可能已经在数组的情况下使用了迭代:

In [66]: for i,n in  enumerate(np.array([(1,2),(3,4),(3,5)])): 
    ...:     b[i] = n 
    ...:                                                                                       
In [67]: b                                                                                     
Out[67]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object)

请记住,对象 dtype 数组是一种备用选项。 np.array(...) 尽可能尝试创建一个多维数组(使用数字 dtype)。只有在不可能的情况下才能创建对象 dtype。对于某些形状组合,它会举手并引发错误。

使用list() 将该数组转换为数组列表也可以(同样的速度):

In [92]: b[:] = list(np.array([(1,2),(3,4),(3,5)]))                                            
In [93]: b                                                                                     
Out[93]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object)

【讨论】:

  • 谢谢..确实,我想要一些适用于任意对象的东西,即使 a 是一个数组。认为在我错过的 numpy 例程中可能有一些直接的东西会告诉他们在尝试计算维度时下降的“深度”,但我想像我一样进行迭代可能是唯一(丑陋的)方法。我会先把这个打开,看看是否还有其他想法。
  • 我认为将 alist 分配给一维对象数组非常可靠。 b[:] = list(....)。如果需要,对象数组可以在填充后重新整形。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2022-09-23
  • 2020-05-24
相关资源
最近更新 更多