强制从可能可迭代对象的列表/数组中创建一维 numpy 数组

use*_*235 5 python arrays loops numpy shapes

我想看看是否有更漂亮的方法来从另一个对象列表/数组创建(即强制创建)一维 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,)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种很好的 pythonic/numpy'ish 方式来强制b具有形状 (3,),以及ab. 现在我这样做:

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. 
Run Code Online (Sandbox Code Playgroud)

哪个有效,但有点难看。我找不到更好的方法来以更内置于 numpy. 有任何想法吗?

(更多上下文:我真正需要做的是以b各种方式重新调整 的维度,因此b如果它们是可迭代的,我不想知道有关其元素维度的任何信息)。谢谢!

hpa*_*ulj 2

In [60]: b = np.empty(3, object)         
Run Code Online (Sandbox Code Playgroud)

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

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,)
Run Code Online (Sandbox Code Playgroud)

对于数组,它不起作用:

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)
Run Code Online (Sandbox Code Playgroud)

您可能在数组情况下使用了迭代:

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)
Run Code Online (Sandbox Code Playgroud)

请记住,对象数据类型数组是一个后备选项。 np.array(...)如果可能的话尝试创建一个多维数组(使用数字数据类型)。仅当不可能时才创建对象数据类型。对于某些形状的组合,它会举手并引发错误。

将该数组转换为数组列表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)
Run Code Online (Sandbox Code Playgroud)